From b2eec07ddc0140d64ce64f0aeaaa9b93e337c078 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Sun, 27 Sep 2026 09:21:58 +0800 Subject: [PATCH 01/42] chore: update Node.js engine version to >=22.12.0 in package.json --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 00971469..1a0c7fbd 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "email": "feedback@koodoreader.com" }, "engines": { - "node": ">=20.0.0", + "node": ">=22.12.0", "npm": ">=6.0.0" }, "repository": "https://github.com/koodo-reader/koodo-reader", From 3a3fd2a88b7b60cd663a2963aa5e58a35435da9a Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Sun, 27 Sep 2026 09:39:39 +0800 Subject: [PATCH 02/42] fix: update i18n script to handle missing terms and write to target locales --- scripts/i18n-script.js | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/scripts/i18n-script.js b/scripts/i18n-script.js index c7ce4581..ecd66cc9 100644 --- a/scripts/i18n-script.js +++ b/scripts/i18n-script.js @@ -9,6 +9,12 @@ for (let index = 0; index < folders.length; index++) { resources.push(`../src/assets/locales/${folder}`); } console.info(resources); +let targets = []; +for (let index = 0; index < folders.length; index++) { + const folder = folders[index]; + targets.push(`../scripts/locales/${folder}`); +} +console.info(targets); // find the missing terms in the english const zhdataRaw = fs.readFileSync( @@ -62,12 +68,11 @@ for (let index = 0; index < resources.length; index++) { missingTerms[term] = referData[term]; } } - // console.info(missingTerms); - const mergedObj = Object.assign({}, targetData, missingTerms); - + console.info(missingTerms); + const target = targets[index]; fs.writeFileSync( - path.join(__dirname, resource), - JSON.stringify(mergedObj, null, 2) + path.join(__dirname, target), + JSON.stringify(missingTerms, null, 2) ); } catch (error) { console.error("Error reading JSON file:", error); From 386ebf838e432c2df1fd8fb0009713ef93e61d0e Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Sun, 27 Sep 2026 10:01:29 +0800 Subject: [PATCH 03/42] fix: correct target path for missing terms and skip specific files in i18n script --- scripts/i18n-script.js | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/scripts/i18n-script.js b/scripts/i18n-script.js index ecd66cc9..1d3f1e4a 100644 --- a/scripts/i18n-script.js +++ b/scripts/i18n-script.js @@ -12,7 +12,7 @@ console.info(resources); let targets = []; for (let index = 0; index < folders.length; index++) { const folder = folders[index]; - targets.push(`../scripts/locales/${folder}`); + targets.push(`../scripts/missing/${folder}`); } console.info(targets); @@ -68,6 +68,12 @@ for (let index = 0; index < resources.length; index++) { missingTerms[term] = referData[term]; } } + if ( + resources[index].includes("en.json") || + resources[index].includes("zh-CN.json") + ) { + continue; + } console.info(missingTerms); const target = targets[index]; fs.writeFileSync( From dce5bc5be458cc3d6366728b1c2aa70a5584446c Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Sun, 27 Sep 2026 10:03:28 +0800 Subject: [PATCH 04/42] refactor: remove unused translation extraction and merging scripts --- scripts/extract-untranslated.js | 65 --------------------------------- scripts/merge-translations.js | 32 ---------------- 2 files changed, 97 deletions(-) delete mode 100644 scripts/extract-untranslated.js delete mode 100644 scripts/merge-translations.js diff --git a/scripts/extract-untranslated.js b/scripts/extract-untranslated.js deleted file mode 100644 index 2dc64965..00000000 --- a/scripts/extract-untranslated.js +++ /dev/null @@ -1,65 +0,0 @@ -#!/usr/bin/env node -// -*- coding: utf-8 -*- -/** - * 提取每个语言文件中value和en.json中同一个键的value相同的词条, - * 并将结果输出到 untranslated/ 目录下的对应文件中。 - */ - -const fs = require("fs"); -const path = require("path"); - -function loadJson(filepath) { - const content = fs.readFileSync(filepath, "utf-8"); - return JSON.parse(content); -} - -function saveJson(filepath, data) { - const content = JSON.stringify(data, null, 2); - fs.writeFileSync(filepath, content, "utf-8"); -} - -function extractUntranslated() { - const localesDir = "../src/assets/locales"; - const outputDir = "../untranslated"; - - // 创建输出目录 - if (!fs.existsSync(outputDir)) { - fs.mkdirSync(outputDir, { recursive: true }); - } - - // 加载 en.json 作为参考 - const enFilepath = path.join(localesDir, "en.json"); - const enData = loadJson(enFilepath); - - // 获取所有符合条件的语言文件 - const langFiles = fs - .readdirSync(localesDir) - .filter( - (f) => f.endsWith(".json") && f !== "en.json" && !f.startsWith("index") - ) - .sort(); - - console.info(`${"文件".padEnd(15)} ${"未翻译条目数".padStart(10)}`); - console.info("-".repeat(30)); - - for (const langFile of langFiles) { - const filepath = path.join(localesDir, langFile); - const data = loadJson(filepath); - - // 提取value与en.json中同一键的value相同的条目 - const untranslated = Object.fromEntries( - Object.entries(data).filter(([k, v]) => enData[k] === v) - ); - - const outPath = path.join(outputDir, langFile); - saveJson(outPath, untranslated); - - const count = Object.keys(untranslated).length; - console.info( - `${langFile.padEnd(15)} ${String(count).padStart(10)} 条 -> ${outPath}` - ); - } - console.info(`提取完成!结果已保存到 ${outputDir}/ 目录。`); -} - -extractUntranslated(); diff --git a/scripts/merge-translations.js b/scripts/merge-translations.js deleted file mode 100644 index 1b15df37..00000000 --- a/scripts/merge-translations.js +++ /dev/null @@ -1,32 +0,0 @@ -const fs = require("fs"); -const path = require("path"); - -const translatedDir = path.join(__dirname, "../translated"); -const localesDir = path.join(__dirname, "../src/assets", "locales"); - -const files = fs.readdirSync(translatedDir).filter((f) => f.endsWith(".json")); - -let totalMerged = 0; - -for (const file of files) { - const translatedPath = path.join(translatedDir, file); - const localesPath = path.join(localesDir, file); - - if (!fs.existsSync(localesPath)) { - console.warn(`⚠️ Skipped: ${file} (not found in locales)`); - continue; - } - - const translated = JSON.parse(fs.readFileSync(translatedPath, "utf-8")); - const locales = JSON.parse(fs.readFileSync(localesPath, "utf-8")); - - const mergedCount = Object.keys(translated).length; - const merged = { ...locales, ...translated }; - - fs.writeFileSync(localesPath, JSON.stringify(merged, null, 2), "utf-8"); - - totalMerged += mergedCount; - console.info(`✅ ${file}: merged ${mergedCount} entries`); -} - -console.info(`\nDone. Total entries merged: ${totalMerged}`); From 8007477069f1c62e0c091e05b75e020729687d88 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Sun, 27 Sep 2026 10:07:38 +0800 Subject: [PATCH 05/42] fix: correct variable naming for folder to file in i18n script --- scripts/i18n-script.js | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/scripts/i18n-script.js b/scripts/i18n-script.js index 1d3f1e4a..7a137ddc 100644 --- a/scripts/i18n-script.js +++ b/scripts/i18n-script.js @@ -2,17 +2,17 @@ const fs = require("fs"); const path = require("path"); const localesPath = path.join(__dirname, "../src/assets/locales"); -const folders = fs.readdirSync(localesPath); +const files = fs.readdirSync(localesPath); let resources = []; -for (let index = 0; index < folders.length; index++) { - const folder = folders[index]; - resources.push(`../src/assets/locales/${folder}`); +for (let index = 0; index < files.length; index++) { + const file = files[index]; + resources.push(`../src/assets/locales/${file}`); } console.info(resources); let targets = []; -for (let index = 0; index < folders.length; index++) { - const folder = folders[index]; - targets.push(`../scripts/missing/${folder}`); +for (let index = 0; index < files.length; index++) { + const file = files[index]; + targets.push(`../scripts/missing/${file}`); } console.info(targets); From b9cc9a601c12cdbbfb10f1762a8922d4cc9b282c Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Wed, 30 Sep 2026 11:18:44 +0800 Subject: [PATCH 06/42] refactor: replace hardcoded language paths with dynamic language retrieval in multiple components --- .../dialogs/supportDialog/component.tsx | 9 +-- .../dialogs/updateDialog/component.tsx | 21 +------ src/containers/header/component.tsx | 18 ++---- .../settings/aboutSetting/component.tsx | 55 ++++--------------- .../settings/accountSetting/component.tsx | 29 +++------- .../settings/dataSetting/component.tsx | 15 +---- .../settings/pluginSetting/component.tsx | 17 ++---- .../settings/syncSetting/component.tsx | 14 ++--- src/pages/login/component.tsx | 9 +-- src/utils/common.ts | 25 ++++++--- src/utils/request/reader.ts | 13 +---- 11 files changed, 66 insertions(+), 159 deletions(-) diff --git a/src/components/dialogs/supportDialog/component.tsx b/src/components/dialogs/supportDialog/component.tsx index 5cbe3ab4..cafd3961 100644 --- a/src/components/dialogs/supportDialog/component.tsx +++ b/src/components/dialogs/supportDialog/component.tsx @@ -7,6 +7,7 @@ import supportAnimation from "../../../assets/lotties/support.json"; import exitAnimation from "../../../assets/lotties/exit.json"; import { getServerRegion, + getWebsiteLang, getWebsiteUrl, handleContextMenu, openInBrowser, @@ -364,13 +365,7 @@ class SupportDialog extends React.Component< let deviceUuid = await TokenService.getFingerprint(); openInBrowser( - getWebsiteUrl() + - (ConfigService.getReaderConfig( - "lang" - ).startsWith("zh") - ? "/zh" - : "/en") + - "/pricing?temp_token=" + + getWebsiteUrl() + getWebsiteLang() + "/pricing?temp_token=" + tempToken + "&device_uuid=" + deviceUuid diff --git a/src/components/dialogs/updateDialog/component.tsx b/src/components/dialogs/updateDialog/component.tsx index fc37b110..93dfa98a 100644 --- a/src/components/dialogs/updateDialog/component.tsx +++ b/src/components/dialogs/updateDialog/component.tsx @@ -7,6 +7,7 @@ import Lottie from "lottie-react"; import animationNew from "../../../assets/lotties/new.json"; import { compareVersions, + getWebsiteLang, getWebsiteUrl, openExternalUrl, } from "../../../utils/common"; @@ -208,17 +209,9 @@ class UpdateInfo extends React.Component { }, 500); } } else { - let lang = "en"; - if ( - ConfigService.getReaderConfig("lang") && - ConfigService.getReaderConfig("lang").startsWith("zh") - ) { - lang = "zh"; - } openExternalUrl( getWebsiteUrl() + - "/" + - lang + + getWebsiteLang() + "/download" + "?version=" + (this.state.updateLog.stable === "yes" @@ -239,17 +232,9 @@ class UpdateInfo extends React.Component {
{ - let lang = "en"; - if ( - ConfigService.getReaderConfig("lang") && - ConfigService.getReaderConfig("lang").startsWith("zh") - ) { - lang = "zh"; - } openExternalUrl( getWebsiteUrl() + - "/" + - lang + + getWebsiteLang() + "/download" + "?version=" + (this.state.updateLog.stable === "yes" diff --git a/src/containers/header/component.tsx b/src/containers/header/component.tsx index cbe7c936..aab17889 100644 --- a/src/containers/header/component.tsx +++ b/src/containers/header/component.tsx @@ -30,6 +30,7 @@ import { generateSyncRecord, getBookPartialMd5, getTaskStats, + getWebsiteLang, getWebsiteUrl, openInBrowser, scanFolderForNewBooks, @@ -669,10 +670,7 @@ class Header extends React.Component { this.setState({ notificationCount: 0 }); let deviceUuid = await TokenService.getFingerprint(); let url = - getWebsiteUrl() + - (ConfigService.getReaderConfig("lang").startsWith("zh") - ? "/zh/faq" - : "/en/faq") + + getWebsiteUrl() + getWebsiteLang() + "/faq" + "?referer=app&version=" + packageJson.version + "&client=web&device=" + @@ -865,11 +863,7 @@ class Header extends React.Component { let tempToken = response.data.access_token; let deviceUuid = await TokenService.getFingerprint(); openInBrowser( - getWebsiteUrl() + - (ConfigService.getReaderConfig("lang").startsWith("zh") - ? "/zh" - : "/en") + - "/pricing?temp_token=" + + getWebsiteUrl() + getWebsiteLang() + "/pricing?temp_token=" + tempToken + "&device_uuid=" + deviceUuid @@ -908,11 +902,7 @@ class Header extends React.Component { let tempToken = response.data.access_token; let deviceUuid = await TokenService.getFingerprint(); openInBrowser( - getWebsiteUrl() + - (ConfigService.getReaderConfig("lang").startsWith("zh") - ? "/zh" - : "/en") + - "/pricing?temp_token=" + + getWebsiteUrl() + getWebsiteLang() + "/pricing?temp_token=" + tempToken + "&device_uuid=" + deviceUuid diff --git a/src/containers/settings/aboutSetting/component.tsx b/src/containers/settings/aboutSetting/component.tsx index 14d34209..204b9a6b 100644 --- a/src/containers/settings/aboutSetting/component.tsx +++ b/src/containers/settings/aboutSetting/component.tsx @@ -5,7 +5,11 @@ import toast from "react-hot-toast"; import { ConfigService } from "../../../assets/lib/kookit-extra-browser.min"; import packageJson from "../../../../package.json"; -import { getWebsiteUrl, openExternalUrl } from "../../../utils/common"; +import { + getWebsiteLang, + getWebsiteUrl, + openExternalUrl, +} from "../../../utils/common"; import copyTextToClipboard from "copy-text-to-clipboard"; import { isElectron } from "react-device-detect"; import { checkDeveloperUpdate } from "../../../utils/request/common"; @@ -51,19 +55,10 @@ class AboutSetting extends React.Component { id: "checking_update", } ); - - let lang = "en"; - if ( - ConfigService.getReaderConfig("lang") && - ConfigService.getReaderConfig("lang").startsWith("zh") - ) { - lang = "zh"; - } setTimeout(() => { openExternalUrl( getWebsiteUrl() + - "/" + - lang + + getWebsiteLang() + "/download" + "?version=developer" ); @@ -140,14 +135,7 @@ class AboutSetting extends React.Component { { - if ( - ConfigService.getReaderConfig("lang") && - ConfigService.getReaderConfig("lang").startsWith("zh") - ) { - openExternalUrl(getWebsiteUrl() + "/zh/document"); - } else { - openExternalUrl(getWebsiteUrl() + "/en/document"); - } + openExternalUrl(getWebsiteUrl() + getWebsiteLang() + "/document"); }} > Visit @@ -159,14 +147,7 @@ class AboutSetting extends React.Component { { - if ( - ConfigService.getReaderConfig("lang") && - ConfigService.getReaderConfig("lang").startsWith("zh") - ) { - openExternalUrl(getWebsiteUrl() + "/zh/faq"); - } else { - openExternalUrl(getWebsiteUrl() + "/en/faq"); - } + openExternalUrl(getWebsiteUrl() + getWebsiteLang() + "/faq"); }} > Visit @@ -178,14 +159,7 @@ class AboutSetting extends React.Component { { - if ( - ConfigService.getReaderConfig("lang") && - ConfigService.getReaderConfig("lang").startsWith("zh") - ) { - openExternalUrl(getWebsiteUrl() + "/zh/support"); - } else { - openExternalUrl(getWebsiteUrl() + "/en/support"); - } + openExternalUrl(getWebsiteUrl() + getWebsiteLang() + "/support"); }} > Visit @@ -197,14 +171,9 @@ class AboutSetting extends React.Component { { - if ( - ConfigService.getReaderConfig("lang") && - ConfigService.getReaderConfig("lang").startsWith("zh") - ) { - openExternalUrl(getWebsiteUrl() + "/zh/use-shortcut"); - } else { - openExternalUrl(getWebsiteUrl() + "/en/use-shortcut"); - } + openExternalUrl( + getWebsiteUrl() + getWebsiteLang() + "/use-shortcut" + ); }} > Visit diff --git a/src/containers/settings/accountSetting/component.tsx b/src/containers/settings/accountSetting/component.tsx index 62b802ea..a6e05489 100644 --- a/src/containers/settings/accountSetting/component.tsx +++ b/src/containers/settings/accountSetting/component.tsx @@ -6,6 +6,7 @@ import toast from "react-hot-toast"; import { formatTimestamp, getServerRegion, + getWebsiteLang, getWebsiteUrl, handleAutoCloudSync, handleContextMenu, @@ -701,8 +702,8 @@ class AccountSetting extends React.Component< {this.props.isAuthed ? "Server region" : "Select server region"} - {ConfigService.getReaderConfig("lang").startsWith("zh") && ( - { openInBrowser( - getWebsiteUrl() + - (ConfigService.getReaderConfig("lang").startsWith("zh") - ? "/zh" - : "/en") + - "/server-region" + getWebsiteUrl() + getWebsiteLang() + "/server-region" ); }} > @@ -837,11 +834,7 @@ class AccountSetting extends React.Component< className="account-login-tips" onClick={() => { openInBrowser( - getWebsiteUrl() + - (ConfigService.getReaderConfig("lang").startsWith("zh") - ? "/zh" - : "/en") + - "/pricing" + getWebsiteUrl() + getWebsiteLang() + "/pricing" ); }} style={{ @@ -1083,11 +1076,7 @@ class AccountSetting extends React.Component< onClick={async () => { if (!this.props.isAuthed) { openInBrowser( - getWebsiteUrl() + - (ConfigService.getReaderConfig("lang").startsWith("zh") - ? "/zh" - : "/en") + - "/pricing" + getWebsiteUrl() + getWebsiteLang() + "/pricing" ); return; } @@ -1096,11 +1085,7 @@ class AccountSetting extends React.Component< let tempToken = response.data.access_token; let deviceUuid = await TokenService.getFingerprint(); openInBrowser( - getWebsiteUrl() + - (ConfigService.getReaderConfig("lang").startsWith("zh") - ? "/zh" - : "/en") + - "/pricing?temp_token=" + + getWebsiteUrl() + getWebsiteLang() + "/pricing?temp_token=" + tempToken + "&device_uuid=" + deviceUuid diff --git a/src/containers/settings/dataSetting/component.tsx b/src/containers/settings/dataSetting/component.tsx index 6e0b0be8..fe28a3b0 100644 --- a/src/containers/settings/dataSetting/component.tsx +++ b/src/containers/settings/dataSetting/component.tsx @@ -6,6 +6,7 @@ import { confirmBrowserExtensionAsync, generateSyncRecord, getStorageLocation, + getWebsiteLang, getWebsiteUrl, reloadManager, vexComfirmAsync, @@ -141,13 +142,7 @@ class DataSetting extends React.Component { }, "", labels, - getWebsiteUrl() + - `/${ - ConfigService.getReaderConfig("lang") && - ConfigService.getReaderConfig("lang").startsWith("zh") - ? "zh" - : "en" - }/add-thirdparty` + getWebsiteUrl() + getWebsiteLang() + "/add-thirdparty" ); if (!result) { @@ -265,11 +260,7 @@ class DataSetting extends React.Component { defaultValues, "", labelsMap, - getWebsiteUrl() + - (ConfigService.getReaderConfig("lang").startsWith("zh") - ? "/zh" - : "/en") + - "/add-thirdparty" + getWebsiteUrl() + getWebsiteLang() + "/add-thirdparty" ); if (!result) { diff --git a/src/containers/settings/pluginSetting/component.tsx b/src/containers/settings/pluginSetting/component.tsx index 5e26642d..06a27b08 100644 --- a/src/containers/settings/pluginSetting/component.tsx +++ b/src/containers/settings/pluginSetting/component.tsx @@ -5,6 +5,7 @@ import _ from "underscore"; import toast from "react-hot-toast"; import { + getWebsiteLang, getWebsiteUrl, handleContextMenu, openExternalUrl, @@ -79,10 +80,7 @@ class SettingDialog extends React.Component< this.setState({ availablePlugins: pluginList }); }; getPluginTutorialUrl = () => - getWebsiteUrl() + - (ConfigService.getReaderConfig("lang")?.startsWith("zh") - ? "/zh/plugin" - : "/en/plugin"); + getWebsiteUrl() + getWebsiteLang() + "/plugin"; handleOpenAddNew = async (scrollToTop = false) => { if (window.electronAPI?.runtime?.windowsStore) { return; @@ -329,14 +327,9 @@ class SettingDialog extends React.Component< className="voice-add-cancel" style={{ marginRight: "10px" }} onClick={() => { - if ( - ConfigService.getReaderConfig("lang") && - ConfigService.getReaderConfig("lang").startsWith("zh") - ) { - openExternalUrl(getWebsiteUrl() + "/zh/plugin"); - } else { - openExternalUrl(getWebsiteUrl() + "/en/plugin"); - } + openExternalUrl( + getWebsiteUrl() + getWebsiteLang() + "/plugin" + ); }} > Document diff --git a/src/containers/settings/syncSetting/component.tsx b/src/containers/settings/syncSetting/component.tsx index 27f0813e..41c280ce 100644 --- a/src/containers/settings/syncSetting/component.tsx +++ b/src/containers/settings/syncSetting/component.tsx @@ -14,6 +14,7 @@ import { generateSyncRecord, getICloudDrivePath, getServerRegion, + getWebsiteLang, getWebsiteUrl, handleContextMenu, openExternalUrl, @@ -964,9 +965,11 @@ class SyncSetting extends React.Component {
{ - openExternalUrl(getWebsiteUrl() + "/zh/add-source"); - }} + onClick={() => { + openExternalUrl( + getWebsiteUrl() + getWebsiteLang() + "/add-source" + ); + }} > {this.props.t("How to fill out")}
@@ -1270,10 +1273,7 @@ class SyncSetting extends React.Component { style={{ textDecoration: "underline" }} onClick={() => { openExternalUrl( - getWebsiteUrl() + - (ConfigService.getReaderConfig("lang").startsWith("zh") - ? "/zh/use-sync" - : "/en/use-sync") + getWebsiteUrl() + getWebsiteLang() + "/use-sync" ); }} > diff --git a/src/pages/login/component.tsx b/src/pages/login/component.tsx index 8f0b8733..bab50679 100644 --- a/src/pages/login/component.tsx +++ b/src/pages/login/component.tsx @@ -8,6 +8,7 @@ import { loginList } from "../../constants/loginList"; import { generateSyncRecord, getServerRegion, + getWebsiteLang, getWebsiteUrl, handleAutoCloudSync, handleContextMenu, @@ -420,13 +421,7 @@ class Login extends React.Component { }} onClick={() => { openInBrowser( - getWebsiteUrl() + - (ConfigService.getReaderConfig("lang").startsWith( - "zh" - ) - ? "/zh" - : "/en") + - "/pricing" + getWebsiteUrl() + getWebsiteLang() + "/pricing" ); }} > diff --git a/src/utils/common.ts b/src/utils/common.ts index 687c1440..dc58bfa7 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -189,11 +189,7 @@ export const confirmBrowserExtensionAsync = async (): Promise => { "Install extension" ); if (!result) { - const lang = ConfigService.getReaderConfig("lang"); - openExternalUrl( - getWebsiteUrl() + - (lang?.startsWith("zh") ? "/zh/use-extension" : "/en/use-extension") - ); + openExternalUrl(getWebsiteUrl() + getWebsiteLang() + "/use-extension"); return false; } return true; @@ -898,8 +894,19 @@ export const getDefaultTransTarget = (langList) => { ); return langMap[langTarget || "English"]; }; -export const WEBSITE_URL = "https://koodoreader.com"; -export const CN_WEBSITE_URL = "https://koodoreader.cn"; +export const WEBSITE_URL = "https://koodoreader.com/"; +export const CN_WEBSITE_URL = "https://koodoreader.cn/"; +export const WEBSITE_LANGS = [ + "zh", + "en", + "ja", + "ko", + "fr", + "de", + "es", + "pt", + "ru", +]; export const getServerRegion = () => { let isUseCN = false; if (ConfigService.getItem("serverRegion")) { @@ -918,6 +925,10 @@ export const getServerRegion = () => { export const getWebsiteUrl = () => { return getServerRegion() === "china" ? CN_WEBSITE_URL : WEBSITE_URL; }; +export const getWebsiteLang = () => { + const lang = ConfigService.getReaderConfig("lang") || "en"; + return WEBSITE_LANGS.find((code) => lang.startsWith(code)) || "en"; +}; export const formatTimestamp = (timestamp) => { if (!timestamp) return ""; diff --git a/src/utils/request/reader.ts b/src/utils/request/reader.ts index 3403bc72..61818cac 100644 --- a/src/utils/request/reader.ts +++ b/src/utils/request/reader.ts @@ -7,6 +7,7 @@ import i18n from "../../i18n"; import { handleExitApp } from "./common"; import { getServerRegion, + getWebsiteLang, getWebsiteUrl, openExternalUrl, openInBrowser, @@ -222,11 +223,7 @@ export const getTTSAudio = async ( isShowingQuotaAlert = false; quotaAlertDismissTime = Date.now(); openExternalUrl( - getWebsiteUrl() + - (ConfigService.getReaderConfig("lang").startsWith("zh") - ? "/zh" - : "/en") + - "/tts-quota" + getWebsiteUrl() + getWebsiteLang() + "/tts-quota" ); } else { isShowingQuotaAlert = false; @@ -253,11 +250,7 @@ export const getTTSAudio = async ( let tempToken = response.data.access_token; let deviceUuid = await TokenService.getFingerprint(); openInBrowser( - getWebsiteUrl() + - (ConfigService.getReaderConfig("lang").startsWith("zh") - ? "/zh" - : "/en") + - "/pricing?temp_token=" + + getWebsiteUrl() + getWebsiteLang() + "/pricing?temp_token=" + tempToken + "&device_uuid=" + deviceUuid From f89f9466d5e8e858c5dab63d2648733faf548e5d Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Wed, 30 Sep 2026 15:01:44 +0800 Subject: [PATCH 07/42] feat: add reporting feature with predefined reasons and feedback handling in PopupAssist --- src/assets/locales/en.json | 7 +++ src/assets/locales/zh-CN.json | 7 +++ src/assets/locales/zh-TW.json | 7 +++ .../popups/popupAssist/component.tsx | 54 ++++++++++++++++++- src/components/popups/popupAssist/index.tsx | 1 + .../popups/popupAssist/interface.tsx | 1 + .../popups/popupAssist/popupAssist.css | 4 ++ src/utils/common.ts | 8 +++ 8 files changed, 88 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index 7cf86240..840dd5f9 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -336,6 +336,13 @@ "Do you want to open this link in browser": "Do you want to open this link in a browser", "WebDAV Info": "WebDAV is an easy-to-use and efficient backup solution, we recommend using WebDAV service provided by NextCloud", "Please wait": "Please wait", + "Report reason": "Report reason", + "Thank you for your feedback": "Thank you for your feedback", + "Inaccurate or misleading information": "Inaccurate or misleading information", + "Inappropriate or offensive content": "Inappropriate or offensive content", + "Irrelevant or off-topic response": "Irrelevant or off-topic response", + "Privacy concern": "Privacy concern", + "Other": "Other", "Server address": "Server address", "Username": "Username", "Password": "Password", diff --git a/src/assets/locales/zh-CN.json b/src/assets/locales/zh-CN.json index 71a687e2..39d4eb95 100644 --- a/src/assets/locales/zh-CN.json +++ b/src/assets/locales/zh-CN.json @@ -478,6 +478,13 @@ "WebDAV Info": "WebDAV是一种简单高效的数据备份方式,这里推荐使用坚果云提供的WebDAV服务", "The Koodo Reader Docker version does not support the data source feature by default. You need to modify the configuration parameters during deployment to manually enable it. Also due to browser's security restrictions, the Docker service must be accessed via HTTPS protocol when you're visiting Koodo Reader via HTTPS protocol.": "Koodo Reader Docker 版默认不支持数据源功能,您需要在部署时修改配置参数手动开启。由于浏览器的安全限制,当您通过 HTTPS 协议访问 Koodo Reader 时, Docker 服务也必须通过 HTTPS 协议访问。", "Please wait": "请稍侯", + "Report reason": "举报原因", + "Thank you for your feedback": "感谢您的反馈", + "Inaccurate or misleading information": "不准确或具有误导性的信息", + "Inappropriate or offensive content": "不适当或冒犯性的内容", + "Irrelevant or off-topic response": "不相关或离题的回答", + "Privacy concern": "隐私问题", + "Other": "其他", "Select server region": "选择服务器地区", "Server region": "服务器地区", "Global": "全球", diff --git a/src/assets/locales/zh-TW.json b/src/assets/locales/zh-TW.json index 62a0b051..c2e36493 100644 --- a/src/assets/locales/zh-TW.json +++ b/src/assets/locales/zh-TW.json @@ -192,6 +192,13 @@ "Do you want to open this link in browser": "是否使用瀏覽器打開此連結", "WebDAV Info": "WebDAV資訊", "Please wait": "請稍侯", + "Report reason": "檢舉原因", + "Thank you for your feedback": "感謝您的回饋", + "Inaccurate or misleading information": "不準確或具有誤導性的資訊", + "Inappropriate or offensive content": "不適當或冒犯性的內容", + "Irrelevant or off-topic response": "不相關或離題的回答", + "Privacy concern": "隱私問題", + "Other": "其他", "Server address": "伺服器地址", "Username": "用戶名", "Password": "密碼", diff --git a/src/components/popups/popupAssist/component.tsx b/src/components/popups/popupAssist/component.tsx index 5df46269..04a2b3b6 100644 --- a/src/components/popups/popupAssist/component.tsx +++ b/src/components/popups/popupAssist/component.tsx @@ -8,7 +8,8 @@ import { import Parser from "html-react-parser"; import DOMPurify from "dompurify"; import { Trans } from "react-i18next"; -import { handleContextMenu } from "../../../utils/common"; +import axios from "axios"; +import { handleContextMenu, REPORT_REASONS, vexSelectAsync } from "../../../utils/common"; import toast from "react-hot-toast"; import { saveAs } from "file-saver"; import { getAnswerStream } from "../../../utils/request/reader"; @@ -442,6 +443,37 @@ class PopupAssist extends React.Component { toast.success(this.props.t("Copied")); }); }; + handleReportAnswer = async (content: string, index: number) => { + const history = + this.state.mode === "ask" ? this.state.askHistory : this.state.chatHistory; + const userMessage = history + .slice(0, index) + .reverse() + .find((item) => item.role === "user"); + const reason = await vexSelectAsync( + "Report reason", + REPORT_REASONS.map((item) => ({ value: item, label: item })) + ); + if (!reason) { + return; + } + toast.loading(this.props.t("Please wait"), { id: "report-feedback" }); + try { + await axios.post("https://api.koodoreader.com/api/llm_report", { + answer: content, + question: userMessage?.content || "", + reason: this.props.t(reason), + user_id: (this.props.userInfo?.time_created || "") + "" || "anonymous", + }); + toast.success(this.props.t("Thank you for your feedback"), { + id: "report-feedback", + }); + } catch (error) { + toast.success(this.props.t("Thank you for your feedback"), { + id: "report-feedback", + }); + } + }; handleRenderHistoryMessage = (message: any[]) => { return message.map((item, index) => { return ( @@ -469,6 +501,26 @@ class PopupAssist extends React.Component {
)} + {item.role === "assistant" && ( +
this.handleReportAnswer(item.content, index)} + > + + + + +
+ )} ); }); diff --git a/src/components/popups/popupAssist/index.tsx b/src/components/popups/popupAssist/index.tsx index 1e46628f..d1e3b027 100644 --- a/src/components/popups/popupAssist/index.tsx +++ b/src/components/popups/popupAssist/index.tsx @@ -18,6 +18,7 @@ const mapStateToProps = (state: stateType) => { htmlBook: state.reader.htmlBook, plugins: state.manager.plugins, isAuthed: state.manager.isAuthed, + userInfo: state.manager.userInfo, }; }; const actionCreator = { diff --git a/src/components/popups/popupAssist/interface.tsx b/src/components/popups/popupAssist/interface.tsx index 8d11cdfb..552f88c0 100644 --- a/src/components/popups/popupAssist/interface.tsx +++ b/src/components/popups/popupAssist/interface.tsx @@ -11,6 +11,7 @@ export interface PopupAssistProps { quoteText: string; plugins: PluginModel[]; isAuthed: boolean; + userInfo?: any; isDockedRight: boolean; handleQuoteText: (quoteText: string) => void; handleOpenMenu: (isOpenMenu: boolean) => void; diff --git a/src/components/popups/popupAssist/popupAssist.css b/src/components/popups/popupAssist/popupAssist.css index 9f6619fa..3fb3629b 100644 --- a/src/components/popups/popupAssist/popupAssist.css +++ b/src/components/popups/popupAssist/popupAssist.css @@ -51,6 +51,10 @@ .popup-assist-copy-button:hover { opacity: 1; } +.popup-assist-report-button { + margin-left: 16px; + line-height: 1; +} @keyframes spin { from { transform: rotate(0deg); diff --git a/src/utils/common.ts b/src/utils/common.ts index dc58bfa7..b0eb5aa5 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -374,6 +374,14 @@ export const vexPasswordInputAsync = ( }); }; +export const REPORT_REASONS = [ + "Inaccurate or misleading information", + "Inappropriate or offensive content", + "Irrelevant or off-topic response", + "Privacy concern", + "Other", +]; + export const vexSelectAsync = ( message: string, options: { value: string; label: string }[] From e9ca0528fbc592d89ee89c375def5ed80ac3e469 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Wed, 30 Sep 2026 15:57:54 +0800 Subject: [PATCH 08/42] feat: update icon fonts and add new report icon - Updated icomoon font files (eot, svg, ttf, woff) to include a new report icon. - Modified style.css to define the new report icon with the unicode "\1f321". - Refactored PopupAssist component to replace SVG icon with the new report icon class. --- src/assets/styles/fonts/icomoon.eot | Bin 30144 -> 30624 bytes src/assets/styles/fonts/icomoon.svg | 1 + src/assets/styles/fonts/icomoon.ttf | Bin 29980 -> 30460 bytes src/assets/styles/fonts/icomoon.woff | Bin 30056 -> 30536 bytes src/assets/styles/style.css | 21 ++++----- .../popups/popupAssist/component.tsx | 41 ++++++++---------- 6 files changed, 31 insertions(+), 32 deletions(-) diff --git a/src/assets/styles/fonts/icomoon.eot b/src/assets/styles/fonts/icomoon.eot index 384f8335303d3a9e485f65d91c50db37ef3212ef..2761b22772fcc069ffa969f46c67d5818cde969c 100644 GIT binary patch delta 824 zcmYjOOH31C5T4n8U)??z+AdOC+HOOoRMHmO3L&HkQk4)7SPh9ptvnAc6pDzadO*FI zkR~Qx2=Qcsw_ZIodNIa>3Gv3sD1ms;#OOt&&K5LI{&{>e|M&g7nfe#p`ikP#U4X;Y z4Kc;<5HT(^=g(=Wm~B0MZDmREq$1Xg#elb9WEG+4b+hYTa9E*hf~^Eb0d z(I6OdJb8ic9AiAetjX%5u42rqyV!rhLKQR>jco7?Gt>?DpE&6pPkWWqLwsKzz#|szA!K_$^iKx z>50V!Kw1FE2hkkqIhAQ9ulyQ;{0at!ybBqri794HTxARl1s*_ovkagB?_n+@Ain{~ zSINjNsW|o&$YLm10@QONCqFq+aO#gU3=Bm%K*49Zi4_G5>dlOc7#NB}fC376iMgpW zy*PgZ`6WONZ3X#2ni*t3$)CwFjBZvhbD0nPKfvI?48%ZDMvxQ~D1d2@Vi1-A%0Xym zuqv6!Ul=Vn=Q7>MQwC`QVyPUt>Ue&euMFHQV4cr4COro+K=kA{Mdpk}n^lTWFi!qZ Q@{9wbgP~~iz0yOB03+E`tN;K2 diff --git a/src/assets/styles/fonts/icomoon.svg b/src/assets/styles/fonts/icomoon.svg index e142e161..fa14b72b 100644 --- a/src/assets/styles/fonts/icomoon.svg +++ b/src/assets/styles/fonts/icomoon.svg @@ -117,4 +117,5 @@ + \ No newline at end of file diff --git a/src/assets/styles/fonts/icomoon.ttf b/src/assets/styles/fonts/icomoon.ttf index b698c95047881227947b156045d3d46dad9be047..df5f438a7e0b4dfe801b434007b5fedcec9c8f53 100644 GIT binary patch delta 784 zcmYjPOK1~O6uo!;nM^*@CNs4$-wCZvV@=W~X-cVu+JL1f*eXRujr}f?c5JHDRl2CU z6KX&Zq=>lFT{bRU6x|eYA&3jXm1t=NK@iPQ!m~f0KmhI@#fTYt$CIBTL5!( zX0kAm`K+D-n2*wVW`+dEE4h>SMdHz!(!%2FFN9!ziF)1?=f-md^?u?Pz``)8o29~{ z3Cs8x;CdJF&}^YJ`C!QQoA@X-+&1UR3-qA0ZhTyMo@aJkhaC0=*NVRR6SZ}Dw9?-*^H)ZdP++Mkc4a> z{@ZD_tA&qY4il+PBN0g^Qbr7o9uy;j*oUGgLKrL775~|*WI&FogdRX$tNXFHxMn9Z z%%M&wdM22@bws)uv1w;m| z#jrff@=_hXS2_aetMT^AxtK8+)>>TlBfg&HJYqN>_4oQchLgR3tb!~yc{LBm`+{*r z7C6DM392kJe{8C*t0+mLC^R<4(d$LznmlrY$O#PRcH(!%!&=ueEbiFlfZfac{B4RX zF(~o4BDz?iJ&9hOi7~PwHp&NI?dj&|yUVWLpJ2Cs1AvWBQzHkpS~Rm*u01i=vHIv5 TS1rzONZqk|XSsI1{1X2HAP<9O delta 301 zcmezKmT}H2#(D-u1_lOhh6V;^1_S?KeItG$w&g&PJwTk0oSRr69(L&q0|TQBkROts zSX=<41%P}I&5@o{nP&3JuMxx%(#ewp*RG{SIA4uO`Yk* z`5VYD0cvO~$OqEQAOlMNOx)qd^fGr6qr4{1tqY<&p3eMAYDb9tx69u0stUj BOaA}> diff --git a/src/assets/styles/fonts/icomoon.woff b/src/assets/styles/fonts/icomoon.woff index a3984713404f71f92071a3c91ce9511afe49b618..a3f40c70610b91395cf125c8bdac0952f17849ce 100644 GIT binary patch delta 835 zcmYk5OH30{6o${4na;G+2c143EUHRhT3Tf}@9D{dX0SfbzIT(P& zXS8XLp*)TMD&|(mZ0P~zA%j(XF_$Y&leR&{j~LHKEWbzFYWVRFg(e4b+?h~lB-$Q3H__2N98L|{B?~q>70ne4Ue9C(5%o*07R3_D>Wa@S zN}S1VKRBc^6cIUOjpI!`Z!#Obj-l6!C^ULxmn4Xs;B;W!=Hc0~ z9FK=qIbijgeExQuZ068x!ZoRZ7dsN@)wn1p+a$Mq`qp0Wjeoe^(DxIp>@xt^{XBE+ pbgpieGFYzFOFLMt-xaEx3%joKQKPbq8{jkwIQluzQ>Il`dElN99T9Ky=3K1Zd%8{#%=ePOFz|8^_0J>sh(sLL+c}kHv nW6|a_MJE_1&nS5&1QZA9Dq>u~AOKRszyu6M;mwOnmofqX_>@}H diff --git a/src/assets/styles/style.css b/src/assets/styles/style.css index 92712b07..df1e94f8 100644 --- a/src/assets/styles/style.css +++ b/src/assets/styles/style.css @@ -1,20 +1,18 @@ @font-face { - font-family: "icomoon"; - src: url("fonts/icomoon.eot?d39nd"); - src: - url("fonts/icomoon.eot?d39nd#iefix") format("embedded-opentype"), - url("fonts/icomoon.ttf?d39nd") format("truetype"), - url("fonts/icomoon.woff?d39nd") format("woff"), - url("fonts/icomoon.svg?d39nd#icomoon") format("svg"); + font-family: 'icomoon'; + src: url('fonts/icomoon.eot?cqtzws'); + src: url('fonts/icomoon.eot?cqtzws#iefix') format('embedded-opentype'), + url('fonts/icomoon.ttf?cqtzws') format('truetype'), + url('fonts/icomoon.woff?cqtzws') format('woff'), + url('fonts/icomoon.svg?cqtzws#icomoon') format('svg'); font-weight: normal; font-style: normal; font-display: block; } -[class^="icon-"], -[class*=" icon-"] { +[class^="icon-"], [class*=" icon-"] { /* use !important to prevent issues with browser extensions that change fonts */ - font-family: "icomoon" !important; + font-family: 'icomoon' !important; speak: never; font-style: normal; font-weight: normal; @@ -27,6 +25,9 @@ -moz-osx-font-smoothing: grayscale; } +.icon-report:before { + content: "\1f321"; +} .icon-sidebar:before { content: "\e96d"; } diff --git a/src/components/popups/popupAssist/component.tsx b/src/components/popups/popupAssist/component.tsx index 04a2b3b6..1bca023a 100644 --- a/src/components/popups/popupAssist/component.tsx +++ b/src/components/popups/popupAssist/component.tsx @@ -9,7 +9,11 @@ import Parser from "html-react-parser"; import DOMPurify from "dompurify"; import { Trans } from "react-i18next"; import axios from "axios"; -import { handleContextMenu, REPORT_REASONS, vexSelectAsync } from "../../../utils/common"; +import { + handleContextMenu, + REPORT_REASONS, + vexSelectAsync, +} from "../../../utils/common"; import toast from "react-hot-toast"; import { saveAs } from "file-saver"; import { getAnswerStream } from "../../../utils/request/reader"; @@ -161,7 +165,10 @@ class PopupAssist extends React.Component { aiService: "official-ai-assistant-plugin", isAddNew: false, }); - ConfigService.setReaderConfig("aiService", "official-ai-assistant-plugin"); + ConfigService.setReaderConfig( + "aiService", + "official-ai-assistant-plugin" + ); } else { this.setState({ isAddNew: true, @@ -259,7 +266,8 @@ class PopupAssist extends React.Component { try { if ( ConfigService.getReaderConfig("aiService") && - ConfigService.getReaderConfig("aiService") === "custom-ai-assistant-plugin" + ConfigService.getReaderConfig("aiService") === + "custom-ai-assistant-plugin" ) { let plugin = this.props.plugins.find( (item) => item.key === "custom-ai-assistant-plugin" @@ -337,7 +345,8 @@ class PopupAssist extends React.Component { } } else if ( ConfigService.getReaderConfig("aiService") && - ConfigService.getReaderConfig("aiService") !== "official-ai-assistant-plugin" + ConfigService.getReaderConfig("aiService") !== + "official-ai-assistant-plugin" ) { } else if (this.props.isAuthed) { let plugin = this.props.plugins.find( @@ -413,10 +422,7 @@ class PopupAssist extends React.Component { } }; handleChangeAiService = (aiService: string) => { - if ( - aiService === "official-ai-assistant-plugin" && - !this.props.isAuthed - ) { + if (aiService === "official-ai-assistant-plugin" && !this.props.isAuthed) { toast(this.props.t("Please upgrade to Pro to use this feature")); this.props.handleSetting(true); this.props.handleSettingMode("account"); @@ -445,7 +451,9 @@ class PopupAssist extends React.Component { }; handleReportAnswer = async (content: string, index: number) => { const history = - this.state.mode === "ask" ? this.state.askHistory : this.state.chatHistory; + this.state.mode === "ask" + ? this.state.askHistory + : this.state.chatHistory; const userMessage = history .slice(0, index) .reverse() @@ -459,6 +467,7 @@ class PopupAssist extends React.Component { } toast.loading(this.props.t("Please wait"), { id: "report-feedback" }); try { + console.log("Reporting answer:", this.props.userInfo); await axios.post("https://api.koodoreader.com/api/llm_report", { answer: content, question: userMessage?.content || "", @@ -506,19 +515,7 @@ class PopupAssist extends React.Component { className="popup-assist-copy-button popup-assist-report-button" onClick={() => this.handleReportAnswer(item.content, index)} > - - - - + )} From 29f5b277066055268abf35d117c9a72810196466 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Wed, 30 Sep 2026 17:06:25 +0800 Subject: [PATCH 09/42] fix bug --- src/assets/lib/kookit-extra-browser.min.js | 2 +- src/assets/lib/kookit-extra.min.mjs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/assets/lib/kookit-extra-browser.min.js b/src/assets/lib/kookit-extra-browser.min.js index e04edcf5..f0239bd2 100644 --- a/src/assets/lib/kookit-extra-browser.min.js +++ b/src/assets/lib/kookit-extra-browser.min.js @@ -1 +1 @@ -import e from"axios";import{Storage as a}from"megajs";import{Buffer as t}from"buffer";import{S3Client as o,ListObjectsV2Command as i,DeleteObjectCommand as n,PutObjectCommand as r,GetObjectCommand as l}from"@aws-sdk/client-s3";import s from"crypto-js";import{AuthType as d,createClient as c}from"webdav/dist/web/index.js";import{SSE as u}from"sse.js";function m(e,a,t,o){return new(t||(t=Promise))((function(i,n){function r(e){try{s(o.next(e))}catch(e){n(e)}}function l(e){try{s(o.throw(e))}catch(e){n(e)}}function s(e){var a;e.done?i(e.value):(a=e.value,a instanceof t?a:new t((function(e){e(a)}))).then(r,l)}s((o=o.apply(e,a||[])).next())}))}const p=e=>"json"===e?"application/json":["jpg","jpeg","png","gif","bmp"].includes(e)?"image/"+e:"zip"===e?"application/zip":"epub"===e?"application/epub+zip":"txt"===e?"text/plain":"pdf"===e?"application/pdf":"mobi"===e?"application/x-mobipocket-ebook":"azw3"===e||"azw"===e?"application/vnd.amazon.ebook":"cbz"===e?"application/x-cbz":"cbr"===e?"application/x-cbr":"cbt"===e?"application/x-cbt":"cb7"===e?"application/x-cb7":"fb2"===e?"application/x-fictionbook+xml":"html"===e?"text/html":"css"===e?"text/css":"js"===e?"application/javascript":"xml"===e?"application/xml":"xhtml"===e?"application/xhtml+xml":"opf"===e?"application/oebps-package+xml":"ncx"===e?"application/x-dtbncx+xml":"mp3"===e?"audio/mpeg":"wav"===e?"audio/wav":"ogg"===e?"audio/ogg":"mp4"===e?"video/mp4":"webm"===e?"video/webm":"avi"===e?"video/x-msvideo":"wmv"===e?"video/x-ms-wmv":"flv"===e?"video/x-flv":"m3u8"===e?"application/x-mpegURL":"ts"===e?"video/MP2T":"3gp"===e?"video/3gpp":"3g2"===e?"video/3gpp2":"db"===e?"application/x-sqlite3":void 0,h=["books","notes","bookmarks","plugins","words"],g=e=>{const a=atob(e),t=a.length,o=new Uint8Array(t);for(let e=0;e{let a="";const t=new Uint8Array(e),o=t.byteLength;for(let e=0;ee.toString(16).padStart(2,"0"))).join("")}))}function N(e){const a=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],t=(e,a)=>e>>>a|e<<32-a,o=(e,a,t)=>e&a^~e&t,i=(e,a,t)=>e&a^e&t^a&t,n=e=>t(e,2)^t(e,13)^t(e,22),r=e=>t(e,6)^t(e,11)^t(e,25),l=e=>t(e,7)^t(e,18)^e>>>3,s=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],d=8*e.length,c=(960-(8*e.length+1)%512)%512,u=e.length+Math.ceil((c+1)/8)+8,m=new Uint8Array(u);m.set(e),m[e.length]=128;new DataView(m.buffer,m.byteLength-8).setBigUint64(0,BigInt(d),!1);for(let e=0;e>>10)+c[e-7]+l(c[e-15])+c[e-16]>>>0);let[u,h,g,f,y,N,v,b]=s;for(let e=0;e<64;e++){const t=b+r(y)+o(y,N,v)+a[e]+c[e]>>>0,l=n(u)+i(u,h,g)>>>0;b=v,v=N,N=y,y=f+t>>>0,f=g,g=h,h=u,u=t+l>>>0}s[0]=s[0]+u>>>0,s[1]=s[1]+h>>>0,s[2]=s[2]+g>>>0,s[3]=s[3]+f>>>0,s[4]=s[4]+y>>>0,s[5]=s[5]+N>>>0,s[6]=s[6]+v>>>0,s[7]=s[7]+b>>>0}var p;const h=new ArrayBuffer(32),g=new DataView(h);return s.forEach(((e,a)=>{g.setUint32(4*a,e,!1)})),h}const v={_chars:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",encode(e){if("string"!=typeof e)throw new Error("Input must be a string");let a="",t=0;const o=this._stringToUtf8Bytes(e),i=o.length;for(;t>2,s=(3&e)<<4|n>>4,d=(15&n)<<2|r>>6,c=63&r;a+=this._chars.charAt(l),a+=this._chars.charAt(s),a+=t-2>=i?"=":this._chars.charAt(d),a+=t-1>=i?"=":this._chars.charAt(c)}return a},decode(e){if("string"!=typeof e)throw new Error("Input must be a string");for(e=e.replace(/[^A-Za-z0-9+/]/g,"");e.length%4!=0;)e+="=";const a=[];let t=0;const o=e.length;for(;t>4,s=(15&i)<<4|n>>2,d=(3&n)<<6|r;a.push(l),-1!==n&&a.push(s),-1!==r&&a.push(d)}return this._utf8BytesToString(a)},_stringToUtf8Bytes(e){const a=[];for(let t=0;t>6),a.push(128|63&o);else if(55296==(64512&o)&&t+1>18),a.push(128|e>>12&63),a.push(128|e>>6&63),a.push(128|63&e)}else a.push(239,191,189),t--}else a.push(224|o>>12),a.push(128|o>>6&63),a.push(128|63&o)}return a},_utf8BytesToString(e){let a="",t=0;for(;t65535){const t=e-65536;a+=String.fromCharCode(55296|t>>10),a+=String.fromCharCode(56320|1023&t)}else a+=String.fromCharCode(e)}else a+="�"}else a+="�"}return a},encodeURL(e){return this.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")},decodeURL(e){for(e=e.replace(/-/g,"+").replace(/_/g,"/");e.length%4;)e+="=";return this.decode(e)}},b=e=>{const a=(e,a)=>{const t=(65535&e)+(65535&a);return(e>>16)+(a>>16)+(t>>16)<<16|65535&t},t=(e,t,o,i,n,r)=>{return a((l=a(a(t,e),a(i,r)))<<(s=n)|l>>>32-s,o);var l,s},o=(e,a,o,i,n,r,l)=>t(a&o|~a&i,e,a,n,r,l),i=(e,a,o,i,n,r,l)=>t(a&i|o&~i,e,a,n,r,l),n=(e,a,o,i,n,r,l)=>t(a^o^i,e,a,n,r,l),r=(e,a,o,i,n,r,l)=>t(o^(a|~i),e,a,n,r,l),l=e.length,s=1+(l+8>>6),d=new Array(16*s).fill(0);for(let a=0;a>2]|=e[a]<>2]|=128<{let a="";for(let t=0;t<4;t++)a+=("0"+(e>>8*t&255).toString(16)).slice(-2);return a})).join("")};class k{constructor(e){this.queue=[],this.runningTasks=0,this.totalTasks=0,this.completedTasks=0,this.hasFailedTasks=!1,this.downloadedSize=0,this.maxConcurrency=e}addTask(e){return m(this,void 0,void 0,(function*(){return this.totalTasks++,new Promise(((a,t)=>{if(this.hasFailedTasks)return void a(void 0);const o=()=>m(this,void 0,void 0,(function*(){if(this.hasFailedTasks)return this.completedTasks++,void a(void 0);try{this.runningTasks++;const t=yield e();return this.completedTasks++,a(t),t}catch(e){throw this.completedTasks++,t(e),e}finally{this.runningTasks--,this.runNext()}}));this.runningTasks0;){const e=this.queue.shift();e&&e()}else if(this.queue.length>0&&this.runningTasks"application/json"===e?"json":e.startsWith("image/")?e.split("/")[1]:"application/zip"===e?"zip":"application/epub+zip"===e?"epub":"text/plain"===e?"txt":"application/pdf"===e?"pdf":"application/x-mobipocket-ebook"===e?"mobi":"application/vnd.amazon.ebook"===e?"azw3":"application/x-cbz"===e?"cbz":"application/x-cbr"===e?"cbr":"application/x-cbt"===e?"cbt":"application/x-cb7"===e?"cb7":"application/x-fictionbook+xml"===e?"fb2":"text/html"===e?"html":"text/css"===e?"css":"application/javascript"===e?"js":"application/xml"===e?"xml":"application/xhtml+xml"===e?"xhtml":"application/oebps-package+xml"===e?"opf":"application/x-dtbncx+xml"===e?"ncx":"audio/mpeg"===e?"mp3":"audio/wav"===e?"wav":"audio/ogg"===e?"ogg":"video/mp4"===e?"mp4":"video/webm"===e?"webm":"video/x-msvideo"===e?"avi":"video/x-ms-wmv"===e?"wmv":"video/x-flv"===e?"flv":"application/x-mpegURL"===e?"m3u8":"video/MP2T"===e?"ts":"video/3gpp"===e?"3gp":"video/3gpp2"===e?"3g2":"application/x-sqlite3"===e?"db":"",databaseList:h,configList:["themeColors","readingTime","appVersion","cloudSyncTime","lastSyncTime","recentBooks","koreaderBooks","recentAdd","deletedBooks","favoriteBooks","shelfList","txtParsers","aiModelConfig","readingStats","noteTags","recordLocation","thirdpartyToken","sortedShelfList","kindleDeviceList","thirdpartyToken","opdsCatalogs","opdsCatalogList"],copyArrayBuffer:e=>{var a=new ArrayBuffer(e.byteLength);return new Uint8Array(a).set(new Uint8Array(e)),a},base64ToArrayBuffer:g,arrayBufferToBase64:f,generateSHA256Hash:y,simpleEncrypt:function(e,a){if(!e||!a)return"";const t=N((new TextEncoder).encode(a)),o=Array.from(new Uint8Array(t)),i=(new TextEncoder).encode(e),n=new Uint8Array(i.length);for(let e=0;e{const a=new Set(["anthropic","zhipu","doubao","moonshot","deepseek","minimax","minimaxi"]),t=new Set(["qwen","hunyuan","siliconflow","siliconflowglobal","infini"]),o=new Set(["sensenova","openai"]),i=new Set(["ollama"]);return e&&"custom"!==e?a.has(e)?{thinking:{type:"disabled"}}:t.has(e)?{enable_thinking:!1}:o.has(e)?{reasoning_effort:"none"}:i.has(e)?{think:!1}:{}:{}},EmailProviders:["gmail.com","qq.com","163.com","yahoo.com","sina.com","sina.cn","126.com","outlook.com","yeah.net","foxmail.com","hotmail.com","protonmail.com","proton.me","icloud.com","mail.com","live.com","live.cn","msn.cn","msn.com","aliyun.com","sohu.com","yandex.com","naver.com","mail.ru","yahoo.co.jp","139.com","189.com","yandex.ru","189.cn"],Base64:v};const E={cloudUrl:"https://cloud.koodoreader.com",cloudCNUrl:"https://cloud.koodoreader.cn",testUrl:"https://cloudtest.960960.xyz",devUrl:"http://192.168.28.159:8000"},C={callbackUrl:"https://web.koodoreader.com/",cnCallbackUrl:"https://web.koodoreader.cn/",dropboxClientId:"vnc67byrssocvy1",yandexClientId:"e5305b62f53844b1994f77a840fd0a37",pcloudClientId:"pg8ten0B3vH",boxClientId:"ltimecqanmpxoaicn9qw3es6l3sdl1ya",duboxClientId:"kc0Ls6xLZugGgLLVhZ8yhUU1cRkRoKNU",yiyiwuClientId:"100197197",microsoftClientId:"506df58a-29ab-4020-afc5-6f423dc80f35",googleClientId:"1051055003225-ph1f5fvh328dhv7bco5jitlnfhg6ks2t.apps.googleusercontent.com",appleClientId:"com.koodoreader.auth",facebookClientId:"2845583825559500",githubClientId:"Ov23liJVzfvJMMEEZ8v2",adriveClientId:"a128ae7b9c094545af623de61dc0a1ef"},T={google:{clientId:C.googleClientId,scopes:["openid email profile"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"openid email profile"}},microsoft:{clientId:C.microsoftClientId,scopes:["openid","profile","User.Read","offline_access"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"openid profile User.Read offline_access"}},facebook:{clientId:C.facebookClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:""}},github:{clientId:C.githubClientId,scopes:["user:email"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"user:email"}},apple:{clientId:C.appleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{}},email:{clientId:"",scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:""}}},w=["backgroundColor","textColor","fontSize","margin","letterSpacing","paraSpacing","scale","brightness","fontFamily","subFontFamily","lineHeight","textAlign","textOrientation","convertChinese","selectAction","fullTranslationMode","readerMode","pdfReaderMode","isBold","isIndent","isSliding","isUnderline","isShadow","isItalic","isInvert","isBionic","isHyphenation","isOrphanWidow","isKeepPDFBackground","isAllowScript","isStartFromEven"];var A={CloudMode:"production",CloudConfig:E,ConvertLangMap:{en:"English",zhCN:"Chinese",zhTW:"Chinese",zhMO:"Chinese",tr:"Turkish",ar:"Arabic",ro:"Romanian",pl:"Polish",cs:"Czech",ja:"Japanese",ta:"Tamil",uk:"Ukrainian",sl:"Slovenian",bo:"Tibetan",id:"Indonesian",hy:"Armenian",el:"Greek",hu:"Hungarian",hi:"Hindi",bg:"Bulgarian",nl:"Dutch",it:"Italian",bn:"Bengali",tl:"Tagalog",sv:"Swedish",ga:"Irish",ko:"Korean",de:"German",ru:"Russian",es:"Spanish",fr:"French",fa:"Persian",ptBR:"Portuguese",th:"Thai",sr:"Serbian",am:"Amharic",da:"Danish",fi:"Finnish",ie:"Interlingue",pt:"Portuguese",vi:"Vietnamese"},ContentRegxConfig:[{label:"Default parser",value:"Default parser",subtitle:"Suitable for most txt files",regex:""},{label:"Chinese novel parser",value:"Chinese novel parser",subtitle:"Suitable for most Chinese novels, eg. 第一章,第2回",regex:"^\\s*(第[0-9一二三四五六七八九十百千万零壹贰叁肆伍陆柒捌玖拾佰仟]+[章回])\\s*"},{label:"English novel parser",value:"English novel parser",subtitle:"Suitable for most English novels, eg. Chapter 1, Part II",regex:"^\\s*(Chapter|Part|Book|CHAPTER|PART|BOOK)\\s*"},{label:"Number parser",value:"Number parser",subtitle:"Suitable for novels with number chapter titles, eg. 1, 2, 3",regex:"^\\s*([0-9]+[\\s.、::·\\-—]+|[一二三四五六七八九十百千万零]+[\\s.、::·\\-—]+).+"}],StyleKeys:w,ThirdpartyConfig:C,LoginAuthRequest:T,LoginDiscovery:{microsoft:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"},facebook:{authorizationEndpoint:"https://www.facebook.com/v12.0/dialog/oauth",tokenEndpoint:"https://graph.facebook.com/v12.0/oauth/access_token"},github:{authorizationEndpoint:"https://github.com/login/oauth/authorize",tokenEndpoint:"https://github.com/login/oauth/access_token"},apple:{authorizationEndpoint:"https://appleid.apple.com/auth/authorize",tokenEndpoint:"https://appleid.apple.com/auth/token"},email:{authorizationEndpoint:"",tokenEndpoint:""}},DriveAuthRequest:{dropbox:{clientId:C.dropboxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{token_access_type:"offline"}},yandex:{clientId:C.yandexClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code",force_confirm:"true"}},boxnet:{clientId:C.boxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}},pcloud:{clientId:C.pcloudClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code"}},dubox:{clientId:C.duboxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code",scope:"basic,netdisk",device_id:"119827642",qrcode:"1"}},yiyiwu:{clientId:C.yiyiwuClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code"}},adrive:{clientId:C.adriveClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}},microsoft:{clientId:C.microsoftClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"files.readwrite.appfolder offline_access"}},google:{clientId:C.googleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"https://www.googleapis.com/auth/drive.file",access_type:"offline"}},microsoft_exp:{clientId:C.microsoftClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"files.readwrite.all offline_access"}},google_exp:{clientId:C.googleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"https://www.googleapis.com/auth/drive",access_type:"offline"}}},DriveDiscovery:{dropbox:{authorizationEndpoint:"https://www.dropbox.com/oauth2/authorize",tokenEndpoint:"https://www.dropbox.com/oauth2/token"},yandex:{authorizationEndpoint:"https://oauth.yandex.com/authorize",tokenEndpoint:"https://oauth.yandex.com/token"},boxnet:{authorizationEndpoint:"https://account.box.com/api/oauth2/authorize",tokenEndpoint:"https://api.box.com/oauth2/token"},pcloud:{authorizationEndpoint:"https://my.pcloud.com/oauth2/authorize",tokenEndpoint:"https://api.pcloud.com/oauth2_token"},dubox:{authorizationEndpoint:"https://openapi.baidu.com/oauth/2.0/authorize",tokenEndpoint:"https://openapi.baidu.com/oauth/2.0/token"},yiyiwu:{authorizationEndpoint:"https://passportapi.115.com/open/authorize",tokenEndpoint:"https://passportapi.115.com/open/authorize"},adrive:{authorizationEndpoint:"https://openapi.alipan.com/oauth/authorize",tokenEndpoint:"https://openapi.alipan.com/oauth/token"},microsoft:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"},microsoft_exp:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google_exp:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"}},AiProviderList:[{id:"custom",name:"Custom model",defaultEndpoint:"",modelsEndpoint:"",isCNAvailable:!0},{id:"openai",name:"OpenAI",defaultEndpoint:"https://api.openai.com/v1",modelsEndpoint:"https://api.openai.com/v1/models"},{id:"anthropic",name:"Anthropic",defaultEndpoint:"https://api.anthropic.com/v1",modelsEndpoint:"https://api.anthropic.com/v1/models"},{id:"google",name:"Google Gemini",defaultEndpoint:"https://generativelanguage.googleapis.com/v1beta/openai",modelsEndpoint:"https://generativelanguage.googleapis.com/v1beta/openai/models"},{id:"deepseek",name:"DeepSeek",defaultEndpoint:"https://api.deepseek.com/v1",modelsEndpoint:"https://api.deepseek.com/v1/models",isCNAvailable:!0},{id:"mistral",name:"Mistral AI",defaultEndpoint:"https://api.mistral.ai/v1",modelsEndpoint:"https://api.mistral.ai/v1/models"},{id:"cohere",name:"Cohere",defaultEndpoint:"https://api.cohere.ai/compatibility/v1",modelsEndpoint:"https://api.cohere.ai/compatibility/v1/models"},{id:"groq",name:"Groq",defaultEndpoint:"https://api.groq.com/openai/v1",modelsEndpoint:"https://api.groq.com/openai/v1/models"},{id:"together",name:"Together AI",defaultEndpoint:"https://api.together.xyz/v1",modelsEndpoint:"https://api.together.xyz/v1/models"},{id:"fireworks",name:"Fireworks AI",defaultEndpoint:"https://api.fireworks.ai/inference/v1",modelsEndpoint:"https://api.fireworks.ai/inference/v1/models"},{id:"perplexity",name:"Perplexity",defaultEndpoint:"https://api.perplexity.ai",modelsEndpoint:"https://api.perplexity.ai/v1/models"},{id:"openrouter",name:"OpenRouter",defaultEndpoint:"https://openrouter.ai/api/v1",modelsEndpoint:"https://openrouter.ai/api/v1/models"},{id:"ai21",name:"AI21 Labs",defaultEndpoint:"https://api.ai21.com/studio/v1",modelsEndpoint:"https://api.ai21.com/studio/v1/models"},{id:"xai",name:"xAI (Grok)",defaultEndpoint:"https://api.x.ai/v1",modelsEndpoint:"https://api.x.ai/v1/models"},{id:"sambanova",name:"SambaNova",defaultEndpoint:"https://api.sambanova.ai/v1",modelsEndpoint:"https://api.sambanova.ai/v1/models"},{id:"cerebras",name:"Cerebras",defaultEndpoint:"https://api.cerebras.ai/v1",modelsEndpoint:"https://api.cerebras.ai/v1/models"},{id:"hyperbolic",name:"Hyperbolic",defaultEndpoint:"https://api.hyperbolic.xyz/v1",modelsEndpoint:"https://api.hyperbolic.xyz/v1/models"},{id:"novita",name:"Novita AI",defaultEndpoint:"https://api.novita.ai/openai",modelsEndpoint:"https://api.novita.ai/openai/models"},{id:"lepton",name:"Lepton AI",defaultEndpoint:"https://llm.lepton.run/api/v1",modelsEndpoint:"https://llm.lepton.run/api/v1/models"},{id:"deepinfra",name:"DeepInfra",defaultEndpoint:"https://api.deepinfra.com/v1/openai",modelsEndpoint:"https://api.deepinfra.com/v1/openai/models"},{id:"replicate",name:"Replicate",defaultEndpoint:"https://api.replicate.com/v1",modelsEndpoint:"https://api.replicate.com/v1/models"},{id:"zhipu",name:"Zhipu AI (智谱)",defaultEndpoint:"https://open.bigmodel.cn/api/paas/v4",modelsEndpoint:"https://open.bigmodel.cn/api/paas/v4/models",isCNAvailable:!0},{id:"qwen",name:"Alibaba Qwen (通义千问)",defaultEndpoint:"https://dashscope.aliyuncs.com/compatible-mode/v1",modelsEndpoint:"https://dashscope.aliyuncs.com/compatible-mode/v1/models",isCNAvailable:!0},{id:"moonshot",name:"Moonshot (月之暗面)",defaultEndpoint:"https://api.moonshot.cn/v1",modelsEndpoint:"https://api.moonshot.cn/v1/models",isCNAvailable:!0},{id:"baidu",name:"Baidu ERNIE (文心一言)",defaultEndpoint:"https://qianfan.baidubce.com/v2",modelsEndpoint:"https://qianfan.baidubce.com/v2/models",isCNAvailable:!0},{id:"doubao",name:"Volcengine Doubao (豆包)",defaultEndpoint:"https://ark.cn-beijing.volces.com/api/v3",modelsEndpoint:"https://ark.cn-beijing.volces.com/api/v3/models",isCNAvailable:!0},{id:"spark",name:"iFlytek Spark (讯飞星火)",defaultEndpoint:"https://spark-api-open.xf-yun.com/v1",modelsEndpoint:"https://spark-api-open.xf-yun.com/v1/models",isCNAvailable:!0},{id:"hunyuan",name:"Tencent Hunyuan (腾讯混元)",defaultEndpoint:"https://api.hunyuan.cloud.tencent.com/v1",modelsEndpoint:"https://api.hunyuan.cloud.tencent.com/v1/models",isCNAvailable:!0},{id:"minimaxi",name:"MiniMax (国内版)",defaultEndpoint:"https://api.minimaxi.com/v1",modelsEndpoint:"https://api.minimaxi.com/v1/models",isCNAvailable:!0},{id:"minimax",name:"MiniMax (国际版)",defaultEndpoint:"https://api.minimax.io/v1",modelsEndpoint:"https://api.minimax.io/v1/models"},{id:"baichuan",name:"Baichuan (百川)",defaultEndpoint:"https://api.baichuan-ai.com/v1",modelsEndpoint:"https://api.baichuan-ai.com/v1/models",isCNAvailable:!0},{id:"stepfun",name:"StepFun (阶跃星辰)",defaultEndpoint:"https://api.stepfun.com/v1",modelsEndpoint:"https://api.stepfun.com/v1/models",isCNAvailable:!0},{id:"lingyi",name:"Lingyiwanwu (零一万物)",defaultEndpoint:"https://api.lingyiwanwu.com/v1",modelsEndpoint:"https://api.lingyiwanwu.com/v1/models",isCNAvailable:!0},{id:"siliconflow",name:"SiliconFlow (硅基流动)",defaultEndpoint:"https://api.siliconflow.cn/v1",modelsEndpoint:"https://api.siliconflow.cn/v1/models",isCNAvailable:!0},{id:"siliconflowglobal",name:"SiliconFlow (国际版)",defaultEndpoint:"https://api.siliconflow.com/v1",modelsEndpoint:"https://api.siliconflow.com/v1/models"},{id:"sensenova",name:"SenseNova (日日新)",defaultEndpoint:"https://token.sensenova.cn/v1",modelsEndpoint:"https://token.sensenova.cn/v1/models",isCNAvailable:!0},{id:"infini",name:"Infini AI (无问芯穹)",defaultEndpoint:"https://cloud.infini-ai.com/maas/v1",modelsEndpoint:"https://cloud.infini-ai.com/maas/v1/models",isCNAvailable:!0},{id:"ollama",name:"Ollama (Local)",defaultEndpoint:"http://localhost:11434/v1",modelsEndpoint:"http://localhost:11434/v1/models",isCNAvailable:!0},{id:"lmstudio",name:"LM Studio (Local)",defaultEndpoint:"http://localhost:1234/v1",modelsEndpoint:"http://localhost:1234/v1/models",isCNAvailable:!0},{id:"vllm",name:"vLLM (Local)",defaultEndpoint:"http://localhost:8000/v1",modelsEndpoint:"http://localhost:8000/v1/models",isCNAvailable:!0},{id:"azure",name:"Azure OpenAI",defaultEndpoint:"",modelsEndpoint:""},{id:"aws_bedrock",name:"AWS Bedrock",defaultEndpoint:"",modelsEndpoint:""}],DefaultPrompts:{aiTranslate:"You are a professional translator. Translate the following text from {from} to {to}. Only return the translated text, no explanations.\n\nText: {text}",aiDict:"You are a professional dictionary assistant. Analyze the word or phrase: {word}\nProvide a comprehensive explanation including pronunciation, definitions, example sentences, and usage notes using {to} as the target language. ",aiAssistance:"You are a helpful reading assistant. The user is reading a book. Here is the context:\n{text}\n\nAnswer the user's question concisely and helpfully, and reply with the same language."},SpeechList:[{label:"English",code:"en",example:"To be, or not to be, that is the question."},{label:"Simplified Chinese",code:"zh",example:"千里之行,始于足下。"},{label:"Japanese",code:"ja",example:"猿も木から落ちる。"},{label:"Korean",code:"ko",example:"가는 날이 장날이다."},{label:"French",code:"fr",example:"Liberté, égalité, fraternité."},{label:"German",code:"de",example:"Der Weg ist das Ziel."},{label:"Spanish",code:"es",example:"La vida es un sueño."},{label:"Italian",code:"it",example:"Dolce far niente."},{label:"Russian",code:"ru",example:"Век живи, век учись."},{label:"Portuguese",code:"pt",example:"Saudade é um sentimento profundo."},{label:"Hindi",code:"hi",example:"सपने वो नहीं जो हम सोते वक्त देखते हैं।"},{label:"Afrikaans",code:"af",example:"Die lewe is 'n geskenk."},{label:"Amharic",code:"am",example:"ዕውቀት ብርሃን ነው።"},{label:"Arabic",code:"ar",example:"العلم نور والجهل ظلام."},{label:"Azerbaijani",code:"az",example:"Elm işıqdır, cəhalət zülmət."},{label:"Bulgarian",code:"bg",example:"Знанието е сила."},{label:"Bengali",code:"bn",example:"জ্ঞানই শক্তি।"},{label:"Bosnian",code:"bs",example:"Znanje je moć."},{label:"Catalan",code:"ca",example:"El saber no ocupa lloc."},{label:"Czech",code:"cs",example:"Bez práce nejsou koláče."},{label:"Welsh",code:"cy",example:"Nid aur popeth melyn."},{label:"Danish",code:"da",example:"Lykken er ikke et sted, men en retning."},{label:"Greek",code:"el",example:"Η γνώση είναι δύναμη."},{label:"Estonian",code:"et",example:"Teadmine on jõud."},{label:"Basque",code:"eu",example:"Jakitea boterea da."},{label:"Persian",code:"fa",example:"دانش قدرت است."},{label:"Finnish",code:"fi",example:"Tieto on valtaa."},{label:"Filipino",code:"fil",example:"Ang kaalaman ay kapangyarihan."},{label:"Irish",code:"ga",example:"Is fearr Gaeilge briste ná Béarla cliste."},{label:"Galician",code:"gl",example:"O saber non ocupa lugar."},{label:"Gujarati",code:"gu",example:"જ્ઞાન શક્તિ છે."},{label:"Hebrew",code:"he",example:"ידע הוא כוח."},{label:"Croatian",code:"hr",example:"Znanje je moć."},{label:"Hungarian",code:"hu",example:"A tudás hatalom."},{label:"Armenian",code:"hy",example:"Գիտելիքը ուժ է."},{label:"Indonesian",code:"id",example:"Pengetahuan adalah kekuatan."},{label:"Icelandic",code:"is",example:"Þekking er máttur."},{label:"Inuktitut",code:"iu",example:"ᐃᓕᓐᓂᐊᕐᓂᖅ ᐱᒻᒪᕆᐅᕗᖅ."},{label:"Javanese",code:"jv",example:"Ilmu iku kelakone kanthi laku."},{label:"Georgian",code:"ka",example:"ცოდნა ძალაა."},{label:"Kazakh",code:"kk",example:"Білім — күш."},{label:"Khmer",code:"km",example:"ចំណេះដឹងគឺជាអំណាច។"},{label:"Kannada",code:"kn",example:"ಜ್ಞಾನವೇ ಶಕ್ತಿ."},{label:"Lao",code:"lo",example:"ຄວາມຮູ້ຄືພະລັງ."},{label:"Lithuanian",code:"lt",example:"Žinios yra jėga."},{label:"Latvian",code:"lv",example:"Zināšanas ir spēks."},{label:"Macedonian",code:"mk",example:"Знаењето е моќ."},{label:"Malayalam",code:"ml",example:"അറിവ് ശക്തിയാണ്."},{label:"Mongolian",code:"mn",example:"Мэдлэг бол хүч."},{label:"Marathi",code:"mr",example:"ज्ञान हीच शक्ती आहे."},{label:"Malay",code:"ms",example:"Ilmu itu cahaya."},{label:"Maltese",code:"mt",example:"L-għarfien huwa l-poter."},{label:"Burmese",code:"my",example:"ဗဟုသုတသည် အားဖြစ်သည်။"},{label:"Norwegian",code:"nb",example:"Kunnskap er makt."},{label:"Nepali",code:"ne",example:"ज्ञान नै शक्ति हो।"},{label:"Dutch",code:"nl",example:"Kennis is macht."},{label:"Odia",code:"or",example:"ଜ୍ଞାନ ହିଁ ଶକ୍ତି।"},{label:"Punjabi",code:"pa",example:"ਗਿਆਨ ਹੀ ਸ਼ਕਤੀ ਹੈ।"},{label:"Polish",code:"pl",example:"Wiedza to potęga."},{label:"Pashto",code:"ps",example:"د پوهې ډیوه روښانه ده."},{label:"Romanian",code:"ro",example:"Cartea este o comoară."},{label:"Sinhala",code:"si",example:"දැනුම බලයකි."},{label:"Slovak",code:"sk",example:"Vedomosti sú sila."},{label:"Slovenian",code:"sl",example:"Znanje je moč."},{label:"Somali",code:"so",example:"Aqoontu waa iftiin."},{label:"Albanian",code:"sq",example:"Dija është fuqi."},{label:"Serbian",code:"sr",example:"Знање је моћ."},{label:"Sundanese",code:"su",example:"Élmu éta cahaya."},{label:"Swedish",code:"sv",example:"Kunskap är makt."},{label:"Swahili",code:"sw",example:"Maarifa ni nguvu."},{label:"Tamil",code:"ta",example:"அறிவே ஆற்றல்."},{label:"Telugu",code:"te",example:"జ్ఞానమే శక్తి."},{label:"Thai",code:"th",example:"ความรู้คือพลัง."},{label:"Turkish",code:"tr",example:"Bilgi güçtür."},{label:"Ukrainian",code:"uk",example:"Знання — сила."},{label:"Urdu",code:"ur",example:"علم ہی طاقت ہے۔"},{label:"Uzbek",code:"uz",example:"Bilim – kuch."},{label:"Vietnamese",code:"vi",example:"Học vấn là sức mạnh."},{label:"Wu Chinese",code:"wuu",example:"学问是力量。"},{label:"Cantonese",code:"yue",example:"知識就係力量。"},{label:"Zulu",code:"zu",example:"Ulwazi lungamandla."}],HighlightStyleTypes:[{value:"background",label:"Highlight background"},{value:"underline",label:"Underline"},{value:"strikethrough",label:"Strikethrough"},{value:"wavy",label:"Wavy underline"}],HighlightPresetColors:{background:["#F3C9C9","#FEF3CD","#CEFACD","#CDE9FA"],underline:["#FF0000","#60A5FA","#FF9900","#2EFF2E"],strikethrough:["#FF0000","#60A5FA","#FF9900","#2EFF2E"],wavy:["#FF0000","#60A5FA","#FF9900","#2EFF2E"]},PresetThemeList:[{key:"yellow",textColor:"rgba(89, 68, 41,1)",backgroundColor:"rgba(233, 216, 188,1)",title:"羊皮"},{key:"green",textColor:"rgba(54, 80, 62,1)",backgroundColor:"rgba(197, 231, 207,1)",title:"护眼"},{key:"light",textColor:"rgba(0,0,0,1)",backgroundColor:"rgba(255,255,255,1)",title:"白天"},{key:"night",textColor:"rgba(255,255,255,1)",backgroundColor:"rgba(44,47,49,1)",title:"黑夜"},{key:"sepia",textColor:"rgba(93, 64, 55,1)",backgroundColor:"rgba(245, 235, 220,1)",title:"古卷"},{key:"blue",textColor:"rgba(28, 52, 84,1)",backgroundColor:"rgba(230, 240, 250,1)",title:"晨雾"},{key:"purple",textColor:"rgba(68, 42, 84,1)",backgroundColor:"rgba(240, 230, 250,1)",title:"紫萝"},{key:"pink",textColor:"rgba(84, 42, 68,1)",backgroundColor:"rgba(250, 235, 245,1)",title:"樱花"},{key:"brown",textColor:"rgba(74, 54, 42,1)",backgroundColor:"rgba(240, 230, 215,1)",title:"木纹"},{key:"gray",textColor:"rgba(64, 64, 64,1)",backgroundColor:"rgba(240, 240, 240,1)",title:"素雅"},{key:"darkgreen",textColor:"rgba(200, 220, 200,1)",backgroundColor:"rgba(25, 35, 30,1)",title:"深林"},{key:"darkblue",textColor:"rgba(200, 210, 230,1)",backgroundColor:"rgba(20, 30, 45,1)",title:"深海"},{key:"coral",textColor:"rgba(84, 50, 42,1)",backgroundColor:"rgba(255, 235, 230,1)",title:"珊瑚"},{key:"mint",textColor:"rgba(42, 74, 64,1)",backgroundColor:"rgba(230, 250, 245,1)",title:"薄荷"},{key:"lavender",textColor:"rgba(54, 42, 74,1)",backgroundColor:"rgba(245, 240, 255,1)",title:"薰衣"},{key:"cream",textColor:"rgba(74, 64, 42,1)",backgroundColor:"rgba(255, 250, 240,1)",title:"奶油"},{key:"darkbrown",textColor:"rgba(230, 215, 200,1)",backgroundColor:"rgba(35, 25, 20,1)",title:"深棕"},{key:"olive",textColor:"rgba(64, 74, 42,1)",backgroundColor:"rgba(240, 245, 230,1)",title:"橄榄"},{key:"rose",textColor:"rgba(84, 42, 54,1)",backgroundColor:"rgba(255, 240, 245,1)",title:"玫瑰"},{key:"slate",textColor:"rgba(54, 64, 74,1)",backgroundColor:"rgba(235, 240, 245,1)",title:"石板"}],OfficialVoiceList:[{name:"af_alloy",gender:"female",displayName:"Alloy",locale:"en-US",language:"English (US)"},{name:"af_aoede",gender:"female",displayName:"Aoede",locale:"en-US",language:"English (US)"},{name:"af_bella",gender:"female",displayName:"Bella",locale:"en-US",language:"English (US)"},{name:"af_heart",gender:"female",displayName:"Heart",locale:"en-US",language:"English (US)"},{name:"af_jessica",gender:"female",displayName:"Jessica",locale:"en-US",language:"English (US)"},{name:"af_kore",gender:"female",displayName:"Kore",locale:"en-US",language:"English (US)"},{name:"af_nicole",gender:"female",displayName:"Nicole",locale:"en-US",language:"English (US)"},{name:"af_nova",gender:"female",displayName:"Nova",locale:"en-US",language:"English (US)"},{name:"af_river",gender:"female",displayName:"River",locale:"en-US",language:"English (US)"},{name:"af_sarah",gender:"female",displayName:"Sarah",locale:"en-US",language:"English (US)"},{name:"af_sky",gender:"female",displayName:"Sky",locale:"en-US",language:"English (US)"},{name:"am_adam",gender:"male",displayName:"Adam",locale:"en-US",language:"English (US)"},{name:"am_echo",gender:"male",displayName:"Echo",locale:"en-US",language:"English (US)"},{name:"am_eric",gender:"male",displayName:"Eric",locale:"en-US",language:"English (US)"},{name:"am_fenrir",gender:"male",displayName:"Fenrir",locale:"en-US",language:"English (US)"},{name:"am_liam",gender:"male",displayName:"Liam",locale:"en-US",language:"English (US)"},{name:"am_michael",gender:"male",displayName:"Michael",locale:"en-US",language:"English (US)"},{name:"am_onyx",gender:"male",displayName:"Onyx",locale:"en-US",language:"English (US)"},{name:"am_puck",gender:"male",displayName:"Puck",locale:"en-US",language:"English (US)"},{name:"am_santa",gender:"male",displayName:"Santa",locale:"en-US",language:"English (US)"},{name:"bf_alice",gender:"female",displayName:"Alice",locale:"en-GB",language:"English (UK)"},{name:"bf_emma",gender:"female",displayName:"Emma",locale:"en-GB",language:"English (UK)"},{name:"bf_isabella",gender:"female",displayName:"Isabella",locale:"en-GB",language:"English (UK)"},{name:"bf_lily",gender:"female",displayName:"Lily",locale:"en-GB",language:"English (UK)"},{name:"bm_daniel",gender:"male",displayName:"Daniel",locale:"en-GB",language:"English (UK)"},{name:"bm_fable",gender:"male",displayName:"Fable",locale:"en-GB",language:"English (UK)"},{name:"bm_george",gender:"male",displayName:"George",locale:"en-GB",language:"English (UK)"},{name:"bm_lewis",gender:"male",displayName:"Lewis",locale:"en-GB",language:"English (UK)"},{name:"ef_dora",gender:"female",displayName:"Dora",locale:"es-ES",language:"Español"},{name:"em_alex",gender:"male",displayName:"Alex",locale:"es-ES",language:"Español"},{name:"em_santa",gender:"male",displayName:"Santa",locale:"es-ES",language:"Español"},{name:"ff_siwis",gender:"female",displayName:"Siwis",locale:"fr-FR",language:"Français"},{name:"hf_alpha",gender:"female",displayName:"Alpha",locale:"hi-IN",language:"हिन्दी"},{name:"hf_beta",gender:"female",displayName:"Beta",locale:"hi-IN",language:"हिन्दी"},{name:"hm_omega",gender:"male",displayName:"Omega",locale:"hi-IN",language:"हिन्दी"},{name:"hm_psi",gender:"male",displayName:"Psi",locale:"hi-IN",language:"हिन्दी"},{name:"if_sara",gender:"female",displayName:"Sara",locale:"it-IT",language:"Italiano"},{name:"im_nicola",gender:"male",displayName:"Nicola",locale:"it-IT",language:"Italiano"},{name:"jf_alpha",gender:"female",displayName:"Alpha",locale:"ja-JP",language:"日本語"},{name:"jf_gongitsune",gender:"female",displayName:"Gongitsune",locale:"ja-JP",language:"日本語"},{name:"jf_nezumi",gender:"female",displayName:"Nezumi",locale:"ja-JP",language:"日本語"},{name:"jf_tebukuro",gender:"female",displayName:"Tebukuro",locale:"ja-JP",language:"日本語"},{name:"jm_kumo",gender:"male",displayName:"Kumo",locale:"ja-JP",language:"日本語"},{name:"pf_dora",gender:"female",displayName:"Dora",locale:"pt-BR",language:"Português (Brasil)"},{name:"pm_alex",gender:"male",displayName:"Alex",locale:"pt-BR",language:"Português (Brasil)"},{name:"pm_santa",gender:"male",displayName:"Santa",locale:"pt-BR",language:"Português (Brasil)"},{name:"zf_xiaoxiao",gender:"female",displayName:"Xiaoxiao",locale:"zh-CN",language:"中文"},{name:"zm_yunxi",gender:"male",displayName:"Yunxi",locale:"zh-CN",language:"中文"},{name:"zf_xiaoyi",gender:"female",displayName:"Xiaoyi",locale:"zh-CN",language:"中文"},{name:"zm_yunyang",gender:"male",displayName:"Yunyang",locale:"zh-CN",language:"中文"},{name:"zm_yunxia",gender:"male",displayName:"Yunxia",locale:"zh-CN",language:"中文"},{name:"zm_yunjian",gender:"male",displayName:"Yunjian",locale:"zh-CN",language:"中文"},{name:"zf_xiaoni",gender:"female",displayName:"Xiaoni 陕西",locale:"zh-CN",language:"中文"},{name:"zf_xiaobei",gender:"female",displayName:"Xiaobei 辽宁",locale:"zh-CN",language:"中文"}],AzureTTSVoiceList:[{name:"de-DE-AmalaNeural",gender:"female",displayName:"Amala",locale:"de-DE"},{name:"de-DE-BerndNeural",gender:"male",displayName:"Bernd",locale:"de-DE"},{name:"de-DE-ConradNeural",gender:"male",displayName:"Conrad",locale:"de-DE"},{name:"de-DE-KatjaNeural",gender:"female",displayName:"Katja",locale:"de-DE"},{name:"en-GB-LibbyNeural",gender:"female",displayName:"Libby",locale:"en-GB"},{name:"en-GB-RyanNeural",gender:"male",displayName:"Ryan",locale:"en-GB"},{name:"en-GB-SoniaNeural",gender:"female",displayName:"Sonia",locale:"en-GB"},{name:"en-US-AmberNeural",gender:"female",displayName:"Amber",locale:"en-US"},{name:"en-US-AriaNeural",gender:"female",displayName:"Aria",locale:"en-US"},{name:"en-US-ChristopherNeural",gender:"male",displayName:"Christopher",locale:"en-US"},{name:"en-US-DavisNeural",gender:"male",displayName:"Davis",locale:"en-US"},{name:"en-US-EricNeural",gender:"male",displayName:"Eric",locale:"en-US"},{name:"en-US-GuyNeural",gender:"male",displayName:"Guy",locale:"en-US"},{name:"en-US-JaneNeural",gender:"female",displayName:"Jane",locale:"en-US"},{name:"en-US-JennyNeural",gender:"female",displayName:"Jenny",locale:"en-US"},{name:"en-US-MichelleNeural",gender:"female",displayName:"Michelle",locale:"en-US"},{name:"en-US-SaraNeural",gender:"female",displayName:"Sara",locale:"en-US"},{name:"es-ES-AbrilNeural",gender:"female",displayName:"Abril",locale:"es-ES"},{name:"es-ES-AlvaroNeural",gender:"male",displayName:"Álvaro",locale:"es-ES"},{name:"es-ES-ArnauNeural",gender:"male",displayName:"Arnau",locale:"es-ES"},{name:"es-ES-ElviraNeural",gender:"female",displayName:"Elvira",locale:"es-ES"},{name:"fr-FR-DeniseNeural",gender:"female",displayName:"Denise",locale:"fr-FR"},{name:"fr-FR-HenriNeural",gender:"male",displayName:"Henri",locale:"fr-FR"},{name:"it-IT-BenignoNeural",gender:"male",displayName:"Benigno",locale:"it-IT"},{name:"it-IT-DiegoNeural",gender:"male",displayName:"Diego",locale:"it-IT"},{name:"it-IT-ElsaNeural",gender:"female",displayName:"Elsa",locale:"it-IT"},{name:"it-IT-IsabellaNeural",gender:"female",displayName:"Isabella",locale:"it-IT"},{name:"ja-JP-KeitaNeural",gender:"male",displayName:"圭太",locale:"ja-JP"},{name:"ja-JP-NanamiNeural",gender:"female",displayName:"七海",locale:"ja-JP"},{name:"ko-KR-InJoonNeural",gender:"male",displayName:"인준",locale:"ko-KR"},{name:"ko-KR-SoonBokNeural",gender:"female",displayName:"순복",locale:"ko-KR"},{name:"ko-KR-SunHiNeural",gender:"female",displayName:"선히",locale:"ko-KR"},{name:"pt-BR-AntonioNeural",gender:"male",displayName:"Antônio",locale:"pt-BR"},{name:"pt-BR-FranciscaNeural",gender:"female",displayName:"Francisca",locale:"pt-BR"},{name:"pt-PT-DuarteNeural",gender:"male",displayName:"Duarte",locale:"pt-PT"},{name:"pt-PT-RaquelNeural",gender:"female",displayName:"Raquel",locale:"pt-PT"},{name:"ru-RU-DariyaNeural",gender:"female",displayName:"Дария",locale:"ru-RU"},{name:"ru-RU-DmitryNeural",gender:"male",displayName:"Дмитрий",locale:"ru-RU"},{name:"ru-RU-SvetlanaNeural",gender:"female",displayName:"Светлана",locale:"ru-RU"},{name:"yue-CN-XiaoMinNeural",gender:"female",displayName:"晓敏",locale:"yue-CN"},{name:"yue-CN-YunSongNeural",gender:"male",displayName:"云松",locale:"yue-CN"},{name:"zh-CN-XiaoxiaoNeural",gender:"female",displayName:"晓晓",locale:"zh-CN"},{name:"zh-CN-YunxiNeural",gender:"male",displayName:"云希",locale:"zh-CN"},{name:"zh-HK-HiuMaanNeural",gender:"female",displayName:"曉曼",locale:"zh-HK"},{name:"zh-HK-WanLungNeural",gender:"male",displayName:"雲龍",locale:"zh-HK"},{name:"zh-TW-HsiaoChenNeural",gender:"female",displayName:"曉臻",locale:"zh-TW"},{name:"zh-TW-YunJheNeural",gender:"male",displayName:"雲哲",locale:"zh-TW"},{name:"af-ZA-AdriNeural",gender:"female",displayName:"Adri",locale:"af-ZA"},{name:"af-ZA-WillemNeural",gender:"male",displayName:"Willem",locale:"af-ZA"},{name:"sq-AL-AnilaNeural",gender:"female",displayName:"Anila",locale:"sq-AL"},{name:"sq-AL-IlirNeural",gender:"male",displayName:"Ilir",locale:"sq-AL"},{name:"am-ET-AmehaNeural",gender:"male",displayName:"አምሀ",locale:"am-ET"},{name:"am-ET-MekdesNeural",gender:"female",displayName:"መቅደስ",locale:"am-ET"},{name:"ar-DZ-AminaNeural",gender:"female",displayName:"أمينة",locale:"ar-DZ"},{name:"ar-DZ-IsmaelNeural",gender:"male",displayName:"إسماعيل",locale:"ar-DZ"},{name:"ar-BH-AliNeural",gender:"male",displayName:"علي",locale:"ar-BH"},{name:"ar-BH-LailaNeural",gender:"female",displayName:"ليلى",locale:"ar-BH"},{name:"ar-EG-SalmaNeural",gender:"female",displayName:"سلمى",locale:"ar-EG"},{name:"ar-EG-ShakirNeural",gender:"male",displayName:"شاكر",locale:"ar-EG"},{name:"ar-IQ-BasselNeural",gender:"male",displayName:"باسل",locale:"ar-IQ"},{name:"ar-IQ-RanaNeural",gender:"female",displayName:"رنا",locale:"ar-IQ"},{name:"ar-JO-SanaNeural",gender:"female",displayName:"سناء",locale:"ar-JO"},{name:"ar-JO-TaimNeural",gender:"male",displayName:"تيم",locale:"ar-JO"},{name:"ar-KW-FahedNeural",gender:"male",displayName:"فهد",locale:"ar-KW"},{name:"ar-KW-NouraNeural",gender:"female",displayName:"نورا",locale:"ar-KW"},{name:"ar-LB-LaylaNeural",gender:"female",displayName:"ليلى",locale:"ar-LB"},{name:"ar-LB-RamiNeural",gender:"male",displayName:"رامي",locale:"ar-LB"},{name:"ar-LY-ImanNeural",gender:"female",displayName:"إيمان",locale:"ar-LY"},{name:"ar-LY-OmarNeural",gender:"male",displayName:"أحمد",locale:"ar-LY"},{name:"ar-MA-JamalNeural",gender:"male",displayName:"جمال",locale:"ar-MA"},{name:"ar-MA-MounaNeural",gender:"female",displayName:"منى",locale:"ar-MA"},{name:"ar-OM-AbdullahNeural",gender:"male",displayName:"عبدالله",locale:"ar-OM"},{name:"ar-OM-AyshaNeural",gender:"female",displayName:"عائشة",locale:"ar-OM"},{name:"ar-QA-AmalNeural",gender:"female",displayName:"أمل",locale:"ar-QA"},{name:"ar-QA-MoazNeural",gender:"male",displayName:"معاذ",locale:"ar-QA"},{name:"ar-SA-HamedNeural",gender:"male",displayName:"حامد",locale:"ar-SA"},{name:"ar-SA-ZariyahNeural",gender:"female",displayName:"زارية",locale:"ar-SA"},{name:"ar-SY-AmanyNeural",gender:"female",displayName:"أماني",locale:"ar-SY"},{name:"ar-SY-LaithNeural",gender:"male",displayName:"ليث",locale:"ar-SY"},{name:"ar-TN-HediNeural",gender:"male",displayName:"هادي",locale:"ar-TN"},{name:"ar-TN-ReemNeural",gender:"female",displayName:"ريم",locale:"ar-TN"},{name:"ar-AE-FatimaNeural",gender:"female",displayName:"فاطمة",locale:"ar-AE"},{name:"ar-AE-HamdanNeural",gender:"male",displayName:"حمدان",locale:"ar-AE"},{name:"ar-YE-MaryamNeural",gender:"female",displayName:"مريم",locale:"ar-YE"},{name:"ar-YE-SalehNeural",gender:"male",displayName:"صالح",locale:"ar-YE"},{name:"az-AZ-BabekNeural",gender:"male",displayName:"Babək",locale:"az-AZ"},{name:"az-AZ-BanuNeural",gender:"female",displayName:"Banu",locale:"az-AZ"},{name:"bn-BD-NabanitaNeural",gender:"female",displayName:"নবনীতা",locale:"bn-BD"},{name:"bn-BD-PradeepNeural",gender:"male",displayName:"প্রদ্বীপ",locale:"bn-BD"},{name:"bn-IN-BashkarNeural",gender:"male",displayName:"ভাস্কর",locale:"bn-IN"},{name:"bn-IN-TanishaaNeural",gender:"female",displayName:"তানিশা",locale:"bn-IN"},{name:"bs-BA-VesnaNeural",gender:"female",displayName:"Vesna",locale:"bs-BA"},{name:"bs-BA-GoranNeural",gender:"male",displayName:"Goran",locale:"bs-BA"},{name:"bg-BG-BorislavNeural",gender:"male",displayName:"Борислав",locale:"bg-BG"},{name:"bg-BG-KalinaNeural",gender:"female",displayName:"Калина",locale:"bg-BG"},{name:"my-MM-NilarNeural",gender:"female",displayName:"နီလာ",locale:"my-MM"},{name:"my-MM-ThihaNeural",gender:"male",displayName:"သီဟ",locale:"my-MM"},{name:"ca-ES-EnricNeural",gender:"male",displayName:"Enric",locale:"ca-ES"},{name:"ca-ES-JoanaNeural",gender:"female",displayName:"Joana",locale:"ca-ES"},{name:"zh-HK-HiuGaaiNeural",gender:"female",displayName:"曉佳",locale:"zh-HK"},{name:"zh-CN-XiaoyiNeural",gender:"female",displayName:"晓伊",locale:"zh-CN"},{name:"zh-CN-YunjianNeural",gender:"male",displayName:"云健",locale:"zh-CN"},{name:"zh-CN-YunxiaNeural",gender:"male",displayName:"云夏",locale:"zh-CN"},{name:"zh-CN-YunyangNeural",gender:"male",displayName:"云扬",locale:"zh-CN"},{name:"zh-CN-liaoning-XiaobeiNeural",gender:"female",displayName:"晓北 辽宁",locale:"zh-CN"},{name:"zh-CN-shaanxi-XiaoniNeural",gender:"female",displayName:"晓妮 陕西",locale:"zh-CN"},{name:"zh-TW-HsiaoYuNeural",gender:"female",displayName:"曉雨",locale:"zh-TW"},{name:"hr-HR-GabrijelaNeural",gender:"female",displayName:"Gabrijela",locale:"hr-HR"},{name:"hr-HR-SreckoNeural",gender:"male",displayName:"Srećko",locale:"hr-HR"},{name:"cs-CZ-AntoninNeural",gender:"male",displayName:"Antonín",locale:"cs-CZ"},{name:"cs-CZ-VlastaNeural",gender:"female",displayName:"Vlasta",locale:"cs-CZ"},{name:"da-DK-ChristelNeural",gender:"female",displayName:"Christel",locale:"da-DK"},{name:"da-DK-JeppeNeural",gender:"male",displayName:"Jeppe",locale:"da-DK"},{name:"nl-BE-ArnaudNeural",gender:"male",displayName:"Arnaud",locale:"nl-BE"},{name:"nl-BE-DenaNeural",gender:"female",displayName:"Dena",locale:"nl-BE"},{name:"nl-NL-ColetteNeural",gender:"female",displayName:"Colette",locale:"nl-NL"},{name:"nl-NL-FennaNeural",gender:"female",displayName:"Fenna",locale:"nl-NL"},{name:"nl-NL-MaartenNeural",gender:"male",displayName:"Maarten",locale:"nl-NL"},{name:"en-AU-WilliamMultilingualNeural",gender:"male",displayName:"William Multilingual",locale:"en-AU"},{name:"en-AU-NatashaNeural",gender:"female",displayName:"Natasha",locale:"en-AU"},{name:"en-CA-ClaraNeural",gender:"female",displayName:"Clara",locale:"en-CA"},{name:"en-CA-LiamNeural",gender:"male",displayName:"Liam",locale:"en-CA"},{name:"en-HK-YanNeural",gender:"female",displayName:"Yan",locale:"en-HK"},{name:"en-HK-SamNeural",gender:"male",displayName:"Sam",locale:"en-HK"},{name:"en-IN-NeerjaNeural",gender:"female",displayName:"Neerja",locale:"en-IN"},{name:"en-IN-PrabhatNeural",gender:"male",displayName:"Prabhat",locale:"en-IN"},{name:"en-IE-ConnorNeural",gender:"male",displayName:"Connor",locale:"en-IE"},{name:"en-IE-EmilyNeural",gender:"female",displayName:"Emily",locale:"en-IE"},{name:"en-KE-AsiliaNeural",gender:"female",displayName:"Asilia",locale:"en-KE"},{name:"en-KE-ChilembaNeural",gender:"male",displayName:"Chilemba",locale:"en-KE"},{name:"en-NZ-MitchellNeural",gender:"male",displayName:"Mitchell",locale:"en-NZ"},{name:"en-NZ-MollyNeural",gender:"female",displayName:"Molly",locale:"en-NZ"},{name:"en-NG-AbeoNeural",gender:"male",displayName:"Abeo",locale:"en-NG"},{name:"en-NG-EzinneNeural",gender:"female",displayName:"Ezinne",locale:"en-NG"},{name:"en-PH-JamesNeural",gender:"male",displayName:"James",locale:"en-PH"},{name:"en-PH-RosaNeural",gender:"female",displayName:"Rosa",locale:"en-PH"},{name:"en-US-AvaNeural",gender:"female",displayName:"Ava",locale:"en-US"},{name:"en-US-AndrewNeural",gender:"male",displayName:"Andrew",locale:"en-US"},{name:"en-US-EmmaNeural",gender:"female",displayName:"Emma",locale:"en-US"},{name:"en-US-BrianNeural",gender:"male",displayName:"Brian",locale:"en-US"},{name:"en-SG-LunaNeural",gender:"female",displayName:"Luna",locale:"en-SG"},{name:"en-SG-WayneNeural",gender:"male",displayName:"Wayne",locale:"en-SG"},{name:"en-ZA-LeahNeural",gender:"female",displayName:"Leah",locale:"en-ZA"},{name:"en-ZA-LukeNeural",gender:"male",displayName:"Luke",locale:"en-ZA"},{name:"en-TZ-ElimuNeural",gender:"male",displayName:"Elimu",locale:"en-TZ"},{name:"en-TZ-ImaniNeural",gender:"female",displayName:"Imani",locale:"en-TZ"},{name:"en-GB-MaisieNeural",gender:"female",displayName:"Maisie",locale:"en-GB"},{name:"en-GB-ThomasNeural",gender:"male",displayName:"Thomas",locale:"en-GB"},{name:"en-US-AnaNeural",gender:"female",displayName:"Ana",locale:"en-US"},{name:"en-US-AndrewMultilingualNeural",gender:"male",displayName:"Andrew Multilingual",locale:"en-US"},{name:"en-US-AvaMultilingualNeural",gender:"female",displayName:"Ava Multilingual",locale:"en-US"},{name:"en-US-BrianMultilingualNeural",gender:"male",displayName:"Brian Multilingual",locale:"en-US"},{name:"en-US-EmmaMultilingualNeural",gender:"female",displayName:"Emma Multilingual",locale:"en-US"},{name:"en-US-RogerNeural",gender:"male",displayName:"Roger",locale:"en-US"},{name:"en-US-SteffanNeural",gender:"male",displayName:"Steffan",locale:"en-US"},{name:"et-EE-AnuNeural",gender:"female",displayName:"Anu",locale:"et-EE"},{name:"et-EE-KertNeural",gender:"male",displayName:"Kert",locale:"et-EE"},{name:"fil-PH-AngeloNeural",gender:"male",displayName:"Angelo",locale:"fil-PH"},{name:"fil-PH-BlessicaNeural",gender:"female",displayName:"Blessica",locale:"fil-PH"},{name:"fi-FI-HarriNeural",gender:"male",displayName:"Harri",locale:"fi-FI"},{name:"fi-FI-NooraNeural",gender:"female",displayName:"Noora",locale:"fi-FI"},{name:"fr-BE-CharlineNeural",gender:"female",displayName:"Charline",locale:"fr-BE"},{name:"fr-BE-GerardNeural",gender:"male",displayName:"Gerard",locale:"fr-BE"},{name:"fr-CA-ThierryNeural",gender:"male",displayName:"Thierry",locale:"fr-CA"},{name:"fr-CA-AntoineNeural",gender:"male",displayName:"Antoine",locale:"fr-CA"},{name:"fr-CA-JeanNeural",gender:"male",displayName:"Jean",locale:"fr-CA"},{name:"fr-CA-SylvieNeural",gender:"female",displayName:"Sylvie",locale:"fr-CA"},{name:"fr-FR-VivienneMultilingualNeural",gender:"female",displayName:"Vivienne Multilingue",locale:"fr-FR"},{name:"fr-FR-RemyMultilingualNeural",gender:"male",displayName:"Rémy Multilingue",locale:"fr-FR"},{name:"fr-FR-EloiseNeural",gender:"female",displayName:"Eloise",locale:"fr-FR"},{name:"fr-CH-ArianeNeural",gender:"female",displayName:"Ariane",locale:"fr-CH"},{name:"fr-CH-FabriceNeural",gender:"male",displayName:"Fabrice",locale:"fr-CH"},{name:"gl-ES-RoiNeural",gender:"male",displayName:"Roi",locale:"gl-ES"},{name:"gl-ES-SabelaNeural",gender:"female",displayName:"Sabela",locale:"gl-ES"},{name:"ka-GE-EkaNeural",gender:"female",displayName:"ეკა",locale:"ka-GE"},{name:"ka-GE-GiorgiNeural",gender:"male",displayName:"გიორგი",locale:"ka-GE"},{name:"de-AT-IngridNeural",gender:"female",displayName:"Ingrid",locale:"de-AT"},{name:"de-AT-JonasNeural",gender:"male",displayName:"Jonas",locale:"de-AT"},{name:"de-DE-SeraphinaMultilingualNeural",gender:"female",displayName:"Seraphine Mehrsprachig",locale:"de-DE"},{name:"de-DE-FlorianMultilingualNeural",gender:"male",displayName:"Florian Mehrsprachig",locale:"de-DE"},{name:"de-DE-KillianNeural",gender:"male",displayName:"Killian",locale:"de-DE"},{name:"de-CH-JanNeural",gender:"male",displayName:"Jan",locale:"de-CH"},{name:"de-CH-LeniNeural",gender:"female",displayName:"Leni",locale:"de-CH"},{name:"el-GR-AthinaNeural",gender:"female",displayName:"Αθηνά",locale:"el-GR"},{name:"el-GR-NestorasNeural",gender:"male",displayName:"Νέστορας",locale:"el-GR"},{name:"gu-IN-DhwaniNeural",gender:"female",displayName:"ધ્વની",locale:"gu-IN"},{name:"gu-IN-NiranjanNeural",gender:"male",displayName:"નિરંજન",locale:"gu-IN"},{name:"he-IL-AvriNeural",gender:"male",displayName:"אברי",locale:"he-IL"},{name:"he-IL-HilaNeural",gender:"female",displayName:"הילה",locale:"he-IL"},{name:"hi-IN-MadhurNeural",gender:"male",displayName:"मधुर",locale:"hi-IN"},{name:"hi-IN-SwaraNeural",gender:"female",displayName:"स्वरा",locale:"hi-IN"},{name:"hu-HU-NoemiNeural",gender:"female",displayName:"Noémi",locale:"hu-HU"},{name:"hu-HU-TamasNeural",gender:"male",displayName:"Tamás",locale:"hu-HU"},{name:"is-IS-GudrunNeural",gender:"female",displayName:"Guðrún",locale:"is-IS"},{name:"is-IS-GunnarNeural",gender:"male",displayName:"Gunnar",locale:"is-IS"},{name:"id-ID-ArdiNeural",gender:"male",displayName:"Ardi",locale:"id-ID"},{name:"id-ID-GadisNeural",gender:"female",displayName:"Gadis",locale:"id-ID"},{name:"iu-Latn-CA-SiqiniqNeural",gender:"female",displayName:"ᓯᕿᓂᖅ",locale:"iu-Latn-CA"},{name:"iu-Latn-CA-TaqqiqNeural",gender:"male",displayName:"ᑕᖅᑭᖅ",locale:"iu-Latn-CA"},{name:"iu-Cans-CA-SiqiniqNeural",gender:"female",displayName:"ᓯᕿᓂᖅ",locale:"iu-Cans-CA"},{name:"iu-Cans-CA-TaqqiqNeural",gender:"male",displayName:"ᑕᖅᑭᖅ",locale:"iu-Cans-CA"},{name:"ga-IE-ColmNeural",gender:"male",displayName:"Colm",locale:"ga-IE"},{name:"ga-IE-OrlaNeural",gender:"female",displayName:"Orla",locale:"ga-IE"},{name:"it-IT-GiuseppeMultilingualNeural",gender:"male",displayName:"Giuseppe Multilingual",locale:"it-IT"},{name:"jv-ID-DimasNeural",gender:"male",displayName:"Dimas",locale:"jv-ID"},{name:"jv-ID-SitiNeural",gender:"female",displayName:"Siti",locale:"jv-ID"},{name:"kn-IN-GaganNeural",gender:"male",displayName:"ಗಗನ್",locale:"kn-IN"},{name:"kn-IN-SapnaNeural",gender:"female",displayName:"ಸಪ್ನಾ",locale:"kn-IN"},{name:"kk-KZ-AigulNeural",gender:"female",displayName:"Айгүл",locale:"kk-KZ"},{name:"kk-KZ-DauletNeural",gender:"male",displayName:"Дәулет",locale:"kk-KZ"},{name:"km-KH-PisethNeural",gender:"male",displayName:"ពិសិដ្ឋ",locale:"km-KH"},{name:"km-KH-SreymomNeural",gender:"female",displayName:"ស្រីមុំ",locale:"km-KH"},{name:"ko-KR-HyunsuMultilingualNeural",gender:"male",displayName:"Hyunsu Multilingual",locale:"ko-KR"},{name:"lo-LA-ChanthavongNeural",gender:"male",displayName:"ຈັນທະວົງ",locale:"lo-LA"},{name:"lo-LA-KeomanyNeural",gender:"female",displayName:"ແກ້ວມະນີ",locale:"lo-LA"},{name:"lv-LV-EveritaNeural",gender:"female",displayName:"Everita",locale:"lv-LV"},{name:"lv-LV-NilsNeural",gender:"male",displayName:"Nils",locale:"lv-LV"},{name:"lt-LT-LeonasNeural",gender:"male",displayName:"Leonas",locale:"lt-LT"},{name:"lt-LT-OnaNeural",gender:"female",displayName:"Ona",locale:"lt-LT"},{name:"mk-MK-AleksandarNeural",gender:"male",displayName:"Александар",locale:"mk-MK"},{name:"mk-MK-MarijaNeural",gender:"female",displayName:"Марија",locale:"mk-MK"},{name:"ms-MY-OsmanNeural",gender:"male",displayName:"Osman",locale:"ms-MY"},{name:"ms-MY-YasminNeural",gender:"female",displayName:"Yasmin",locale:"ms-MY"},{name:"ml-IN-MidhunNeural",gender:"male",displayName:"മിഥുൻ",locale:"ml-IN"},{name:"ml-IN-SobhanaNeural",gender:"female",displayName:"ശോഭന",locale:"ml-IN"},{name:"mt-MT-GraceNeural",gender:"female",displayName:"Grace",locale:"mt-MT"},{name:"mt-MT-JosephNeural",gender:"male",displayName:"Joseph",locale:"mt-MT"},{name:"mr-IN-AarohiNeural",gender:"female",displayName:"आरोही",locale:"mr-IN"},{name:"mr-IN-ManoharNeural",gender:"male",displayName:"मनोहर",locale:"mr-IN"},{name:"mn-MN-BataaNeural",gender:"male",displayName:"Батаа",locale:"mn-MN"},{name:"mn-MN-YesuiNeural",gender:"female",displayName:"Есүй",locale:"mn-MN"},{name:"ne-NP-HemkalaNeural",gender:"female",displayName:"हेमकला",locale:"ne-NP"},{name:"ne-NP-SagarNeural",gender:"male",displayName:"सागर",locale:"ne-NP"},{name:"nb-NO-FinnNeural",gender:"male",displayName:"Finn",locale:"nb-NO"},{name:"nb-NO-PernilleNeural",gender:"female",displayName:"Pernille",locale:"nb-NO"},{name:"ps-AF-GulNawazNeural",gender:"male",displayName:" ګل نواز",locale:"ps-AF"},{name:"ps-AF-LatifaNeural",gender:"female",displayName:"لطيفه",locale:"ps-AF"},{name:"fa-IR-DilaraNeural",gender:"female",displayName:"دلارا",locale:"fa-IR"},{name:"fa-IR-FaridNeural",gender:"male",displayName:"فرید",locale:"fa-IR"},{name:"pl-PL-MarekNeural",gender:"male",displayName:"Marek",locale:"pl-PL"},{name:"pl-PL-ZofiaNeural",gender:"female",displayName:"Zofia",locale:"pl-PL"},{name:"pt-BR-ThalitaMultilingualNeural",gender:"female",displayName:"Thalita multilíngue",locale:"pt-BR"},{name:"ro-RO-AlinaNeural",gender:"female",displayName:"Alina",locale:"ro-RO"},{name:"ro-RO-EmilNeural",gender:"male",displayName:"Emil",locale:"ro-RO"},{name:"sr-RS-NicholasNeural",gender:"male",displayName:"Никола",locale:"sr-RS"},{name:"sr-RS-SophieNeural",gender:"female",displayName:"Софија",locale:"sr-RS"},{name:"si-LK-SameeraNeural",gender:"male",displayName:"සමීර",locale:"si-LK"},{name:"si-LK-ThiliniNeural",gender:"female",displayName:"තිළිණි",locale:"si-LK"},{name:"sk-SK-LukasNeural",gender:"male",displayName:"Lukáš",locale:"sk-SK"},{name:"sk-SK-ViktoriaNeural",gender:"female",displayName:"Viktória",locale:"sk-SK"},{name:"sl-SI-PetraNeural",gender:"female",displayName:"Petra",locale:"sl-SI"},{name:"sl-SI-RokNeural",gender:"male",displayName:"Rok",locale:"sl-SI"},{name:"so-SO-MuuseNeural",gender:"male",displayName:"Muuse",locale:"so-SO"},{name:"so-SO-UbaxNeural",gender:"female",displayName:"Ubax",locale:"so-SO"},{name:"es-AR-ElenaNeural",gender:"female",displayName:"Elena",locale:"es-AR"},{name:"es-AR-TomasNeural",gender:"male",displayName:"Tomas",locale:"es-AR"},{name:"es-BO-MarceloNeural",gender:"male",displayName:"Marcelo",locale:"es-BO"},{name:"es-BO-SofiaNeural",gender:"female",displayName:"Sofia",locale:"es-BO"},{name:"es-CL-CatalinaNeural",gender:"female",displayName:"Catalina",locale:"es-CL"},{name:"es-CL-LorenzoNeural",gender:"male",displayName:"Lorenzo",locale:"es-CL"},{name:"es-CO-GonzaloNeural",gender:"male",displayName:"Gonzalo",locale:"es-CO"},{name:"es-CO-SalomeNeural",gender:"female",displayName:"Salome",locale:"es-CO"},{name:"es-ES-XimenaNeural",gender:"female",displayName:"Ximena",locale:"es-ES"},{name:"es-CR-JuanNeural",gender:"male",displayName:"Juan",locale:"es-CR"},{name:"es-CR-MariaNeural",gender:"female",displayName:"María",locale:"es-CR"},{name:"es-CU-BelkysNeural",gender:"female",displayName:"Belkys",locale:"es-CU"},{name:"es-CU-ManuelNeural",gender:"male",displayName:"Manuel",locale:"es-CU"},{name:"es-DO-EmilioNeural",gender:"male",displayName:"Emilio",locale:"es-DO"},{name:"es-DO-RamonaNeural",gender:"female",displayName:"Ramona",locale:"es-DO"},{name:"es-EC-AndreaNeural",gender:"female",displayName:"Andrea",locale:"es-EC"},{name:"es-EC-LuisNeural",gender:"male",displayName:"Luis",locale:"es-EC"},{name:"es-SV-LorenaNeural",gender:"female",displayName:"Lorena",locale:"es-SV"},{name:"es-SV-RodrigoNeural",gender:"male",displayName:"Rodrigo",locale:"es-SV"},{name:"es-GQ-JavierNeural",gender:"male",displayName:"Javier",locale:"es-GQ"},{name:"es-GQ-TeresaNeural",gender:"female",displayName:"Teresa",locale:"es-GQ"},{name:"es-GT-AndresNeural",gender:"male",displayName:"Andrés",locale:"es-GT"},{name:"es-GT-MartaNeural",gender:"female",displayName:"Marta",locale:"es-GT"},{name:"es-HN-CarlosNeural",gender:"male",displayName:"Carlos",locale:"es-HN"},{name:"es-HN-KarlaNeural",gender:"female",displayName:"Karla",locale:"es-HN"},{name:"es-MX-DaliaNeural",gender:"female",displayName:"Dalia",locale:"es-MX"},{name:"es-MX-JorgeNeural",gender:"male",displayName:"Jorge",locale:"es-MX"},{name:"es-NI-FedericoNeural",gender:"male",displayName:"Federico",locale:"es-NI"},{name:"es-NI-YolandaNeural",gender:"female",displayName:"Yolanda",locale:"es-NI"},{name:"es-PA-MargaritaNeural",gender:"female",displayName:"Margarita",locale:"es-PA"},{name:"es-PA-RobertoNeural",gender:"male",displayName:"Roberto",locale:"es-PA"},{name:"es-PY-MarioNeural",gender:"male",displayName:"Mario",locale:"es-PY"},{name:"es-PY-TaniaNeural",gender:"female",displayName:"Tania",locale:"es-PY"},{name:"es-PE-AlexNeural",gender:"male",displayName:"Alex",locale:"es-PE"},{name:"es-PE-CamilaNeural",gender:"female",displayName:"Camila",locale:"es-PE"},{name:"es-PR-KarinaNeural",gender:"female",displayName:"Karina",locale:"es-PR"},{name:"es-PR-VictorNeural",gender:"male",displayName:"Víctor",locale:"es-PR"},{name:"es-US-AlonsoNeural",gender:"male",displayName:"Alonso",locale:"es-US"},{name:"es-US-PalomaNeural",gender:"female",displayName:"Paloma",locale:"es-US"},{name:"es-UY-MateoNeural",gender:"male",displayName:"Mateo",locale:"es-UY"},{name:"es-UY-ValentinaNeural",gender:"female",displayName:"Valentina",locale:"es-UY"},{name:"es-VE-PaolaNeural",gender:"female",displayName:"Paola",locale:"es-VE"},{name:"es-VE-SebastianNeural",gender:"male",displayName:"Sebastián",locale:"es-VE"},{name:"su-ID-JajangNeural",gender:"male",displayName:"Jajang",locale:"su-ID"},{name:"su-ID-TutiNeural",gender:"female",displayName:"Tuti",locale:"su-ID"},{name:"sw-KE-RafikiNeural",gender:"male",displayName:"Rafiki",locale:"sw-KE"},{name:"sw-KE-ZuriNeural",gender:"female",displayName:"Zuri",locale:"sw-KE"},{name:"sw-TZ-DaudiNeural",gender:"male",displayName:"Daudi",locale:"sw-TZ"},{name:"sw-TZ-RehemaNeural",gender:"female",displayName:"Rehema",locale:"sw-TZ"},{name:"sv-SE-MattiasNeural",gender:"male",displayName:"Mattias",locale:"sv-SE"},{name:"sv-SE-SofieNeural",gender:"female",displayName:"Sofie",locale:"sv-SE"},{name:"ta-IN-PallaviNeural",gender:"female",displayName:"பல்லவி",locale:"ta-IN"},{name:"ta-IN-ValluvarNeural",gender:"male",displayName:"வள்ளுவர்",locale:"ta-IN"},{name:"ta-MY-KaniNeural",gender:"female",displayName:"கனி",locale:"ta-MY"},{name:"ta-MY-SuryaNeural",gender:"male",displayName:"சூர்யா",locale:"ta-MY"},{name:"ta-SG-AnbuNeural",gender:"male",displayName:"அன்பு",locale:"ta-SG"},{name:"ta-SG-VenbaNeural",gender:"female",displayName:"வெண்பா",locale:"ta-SG"},{name:"ta-LK-KumarNeural",gender:"male",displayName:"குமார்",locale:"ta-LK"},{name:"ta-LK-SaranyaNeural",gender:"female",displayName:"சரண்யா",locale:"ta-LK"},{name:"te-IN-MohanNeural",gender:"male",displayName:"మోహన్",locale:"te-IN"},{name:"te-IN-ShrutiNeural",gender:"female",displayName:"శ్రుతి",locale:"te-IN"},{name:"th-TH-NiwatNeural",gender:"male",displayName:"นิวัฒน์",locale:"th-TH"},{name:"th-TH-PremwadeeNeural",gender:"female",displayName:"เปรมวดี",locale:"th-TH"},{name:"tr-TR-EmelNeural",gender:"female",displayName:"Emel",locale:"tr-TR"},{name:"tr-TR-AhmetNeural",gender:"male",displayName:"Ahmet",locale:"tr-TR"},{name:"uk-UA-OstapNeural",gender:"male",displayName:"Остап",locale:"uk-UA"},{name:"uk-UA-PolinaNeural",gender:"female",displayName:"Поліна",locale:"uk-UA"},{name:"ur-IN-GulNeural",gender:"female",displayName:"گل",locale:"ur-IN"},{name:"ur-IN-SalmanNeural",gender:"male",displayName:"سلمان",locale:"ur-IN"},{name:"ur-PK-AsadNeural",gender:"male",displayName:"اسد",locale:"ur-PK"},{name:"ur-PK-UzmaNeural",gender:"female",displayName:"عظمیٰ",locale:"ur-PK"},{name:"uz-UZ-MadinaNeural",gender:"female",displayName:"Madina",locale:"uz-UZ"},{name:"uz-UZ-SardorNeural",gender:"male",displayName:"Sardor",locale:"uz-UZ"},{name:"vi-VN-HoaiMyNeural",gender:"female",displayName:"Hoài My",locale:"vi-VN"},{name:"vi-VN-NamMinhNeural",gender:"male",displayName:"Nam Minh",locale:"vi-VN"},{name:"cy-GB-AledNeural",gender:"male",displayName:"Aled",locale:"cy-GB"},{name:"cy-GB-NiaNeural",gender:"female",displayName:"Nia",locale:"cy-GB"},{name:"zu-ZA-ThandoNeural",gender:"female",displayName:"Thando",locale:"zu-ZA"},{name:"zu-ZA-ThembaNeural",gender:"male",displayName:"Themba",locale:"zu-ZA"},{name:"as-IN-YashicaNeural",gender:"female",displayName:"যাশিকা",locale:"as-IN"},{name:"as-IN-PriyomNeural",gender:"male",displayName:"প্ৰিয়ম",locale:"as-IN"},{name:"ca-ES-AlbaNeural",gender:"female",displayName:"Alba",locale:"ca-ES"},{name:"de-DE-ChristophNeural",gender:"male",displayName:"Christoph",locale:"de-DE"},{name:"de-DE-ElkeNeural",gender:"female",displayName:"Elke",locale:"de-DE"},{name:"de-DE-GiselaNeural",gender:"female",displayName:"Gisela",locale:"de-DE"},{name:"de-DE-KasperNeural",gender:"male",displayName:"Kasper",locale:"de-DE"},{name:"de-DE-KlarissaNeural",gender:"female",displayName:"Klarissa",locale:"de-DE"},{name:"de-DE-KlausNeural",gender:"male",displayName:"Klaus",locale:"de-DE"},{name:"de-DE-LouisaNeural",gender:"female",displayName:"Louisa",locale:"de-DE"},{name:"de-DE-MajaNeural",gender:"female",displayName:"Maja",locale:"de-DE"},{name:"de-DE-RalfNeural",gender:"male",displayName:"Ralf",locale:"de-DE"},{name:"de-DE-TanjaNeural",gender:"female",displayName:"Tanja",locale:"de-DE"},{name:"en-AU-WilliamNeural",gender:"male",displayName:"William",locale:"en-AU"},{name:"en-AU-AnnetteNeural",gender:"female",displayName:"Annette",locale:"en-AU"},{name:"en-AU-CarlyNeural",gender:"female",displayName:"Carly",locale:"en-AU"},{name:"en-AU-DarrenNeural",gender:"male",displayName:"Darren",locale:"en-AU"},{name:"en-AU-DuncanNeural",gender:"male",displayName:"Duncan",locale:"en-AU"},{name:"en-AU-ElsieNeural",gender:"female",displayName:"Elsie",locale:"en-AU"},{name:"en-AU-FreyaNeural",gender:"female",displayName:"Freya",locale:"en-AU"},{name:"en-AU-JoanneNeural",gender:"female",displayName:"Joanne",locale:"en-AU"},{name:"en-AU-KenNeural",gender:"male",displayName:"Ken",locale:"en-AU"},{name:"en-AU-KimNeural",gender:"female",displayName:"Kim",locale:"en-AU"},{name:"en-AU-NeilNeural",gender:"male",displayName:"Neil",locale:"en-AU"},{name:"en-AU-TimNeural",gender:"male",displayName:"Tim",locale:"en-AU"},{name:"en-AU-TinaNeural",gender:"female",displayName:"Tina",locale:"en-AU"},{name:"en-GB-AdaMultilingualNeural",gender:"female",displayName:"Ada Multilingual",locale:"en-GB"},{name:"en-GB-OllieMultilingualNeural",gender:"male",displayName:"Ollie Multilingual",locale:"en-GB"},{name:"en-GB-AbbiNeural",gender:"female",displayName:"Abbi",locale:"en-GB"},{name:"en-GB-AlfieNeural",gender:"male",displayName:"Alfie",locale:"en-GB"},{name:"en-GB-BellaNeural",gender:"female",displayName:"Bella",locale:"en-GB"},{name:"en-GB-ElliotNeural",gender:"male",displayName:"Elliot",locale:"en-GB"},{name:"en-GB-EthanNeural",gender:"male",displayName:"Ethan",locale:"en-GB"},{name:"en-GB-HollieNeural",gender:"female",displayName:"Hollie",locale:"en-GB"},{name:"en-GB-NoahNeural",gender:"male",displayName:"Noah",locale:"en-GB"},{name:"en-GB-OliverNeural",gender:"male",displayName:"Oliver",locale:"en-GB"},{name:"en-GB-OliviaNeural",gender:"female",displayName:"Olivia",locale:"en-GB"},{name:"en-GB-MiaNeural",gender:"female",displayName:"Mia",locale:"en-GB"},{name:"en-IN-AartiIndicNeural",gender:"female",displayName:"Aarti Indic",locale:"en-IN"},{name:"en-IN-ArjunIndicNeural",gender:"male",displayName:"Arjun Indic",locale:"en-IN"},{name:"en-IN-NeerjaIndicNeural",gender:"female",displayName:"Neerja Indic",locale:"en-IN"},{name:"en-IN-PrabhatIndicNeural",gender:"male",displayName:"Prabhat Indic",locale:"en-IN"},{name:"en-IN-AaravNeural",gender:"male",displayName:"Aarav",locale:"en-IN"},{name:"en-IN-AashiNeural",gender:"female",displayName:"Aashi",locale:"en-IN"},{name:"en-IN-AartiNeural",gender:"female",displayName:"Aarti",locale:"en-IN"},{name:"en-IN-ArjunNeural",gender:"male",displayName:"Arjun",locale:"en-IN"},{name:"en-IN-AnanyaNeural",gender:"female",displayName:"Ananya",locale:"en-IN"},{name:"en-IN-KavyaNeural",gender:"female",displayName:"Kavya",locale:"en-IN"},{name:"en-IN-KunalNeural",gender:"male",displayName:"Kunal",locale:"en-IN"},{name:"en-IN-RehaanNeural",gender:"male",displayName:"Rehaan",locale:"en-IN"},{name:"en-US-AmandaMultilingualNeural",gender:"female",displayName:"Amanda Multilingual",locale:"en-US"},{name:"en-US-AdamMultilingualNeural",gender:"male",displayName:"Adam Multilingual",locale:"en-US"},{name:"en-US-PhoebeMultilingualNeural",gender:"female",displayName:"Phoebe Multilingual",locale:"en-US"},{name:"en-US-AlloyTurboMultilingualNeural",gender:"male",displayName:"Alloy Turbo Multilingual",locale:"en-US"},{name:"en-US-EchoTurboMultilingualNeural",gender:"male",displayName:"Echo Turbo Multilingual",locale:"en-US"},{name:"en-US-FableTurboMultilingualNeural",gender:"female",displayName:"Fable Turbo Multilingual",locale:"en-US"},{name:"en-US-OnyxTurboMultilingualNeural",gender:"male",displayName:"Onyx Turbo Multilingual",locale:"en-US"},{name:"en-US-NovaTurboMultilingualNeural",gender:"female",displayName:"Nova Turbo Multilingual",locale:"en-US"},{name:"en-US-ShimmerTurboMultilingualNeural",gender:"female",displayName:"Shimmer Turbo Multilingual",locale:"en-US"},{name:"en-US-JasonNeural",gender:"male",displayName:"Jason",locale:"en-US"},{name:"en-US-KaiNeural",gender:"male",displayName:"Kai",locale:"en-US"},{name:"en-US-LunaNeural",gender:"female",displayName:"Luna",locale:"en-US"},{name:"en-US-TonyNeural",gender:"male",displayName:"Tony",locale:"en-US"},{name:"en-US-NancyNeural",gender:"female",displayName:"Nancy",locale:"en-US"},{name:"en-US-CoraMultilingualNeural",gender:"female",displayName:"Cora Multilingual",locale:"en-US"},{name:"en-US-ChristopherMultilingualNeural",gender:"male",displayName:"Christopher Multilingual",locale:"en-US"},{name:"en-US-BrandonMultilingualNeural",gender:"male",displayName:"Brandon Multilingual",locale:"en-US"},{name:"en-US-AshleyNeural",gender:"female",displayName:"Ashley",locale:"en-US"},{name:"en-US-BrandonNeural",gender:"male",displayName:"Brandon",locale:"en-US"},{name:"en-US-CoraNeural",gender:"female",displayName:"Cora",locale:"en-US"},{name:"en-US-DavisMultilingualNeural",gender:"male",displayName:"Davis Multilingual",locale:"en-US"},{name:"en-US-DerekMultilingualNeural",gender:"male",displayName:"Derek Multilingual",locale:"en-US"},{name:"en-US-DustinMultilingualNeural",gender:"male",displayName:"Dustin Multilingual",locale:"en-US"},{name:"en-US-ElizabethNeural",gender:"female",displayName:"Elizabeth",locale:"en-US"},{name:"en-US-JacobNeural",gender:"male",displayName:"Jacob",locale:"en-US"},{name:"en-US-JennyMultilingualNeural",gender:"female",displayName:"Jenny Multilingual",locale:"en-US"},{name:"en-US-LewisMultilingualNeural",gender:"male",displayName:"Lewis Multilingual",locale:"en-US"},{name:"en-US-LolaMultilingualNeural",gender:"female",displayName:"Lola Multilingual",locale:"en-US"},{name:"en-US-MonicaNeural",gender:"female",displayName:"Monica",locale:"en-US"},{name:"en-US-NancyMultilingualNeural",gender:"female",displayName:"Nancy Multilingual",locale:"en-US"},{name:"en-US-RyanMultilingualNeural",gender:"male",displayName:"Ryan Multilingual",locale:"en-US"},{name:"en-US-SamuelMultilingualNeural",gender:"male",displayName:"Samuel Multilingual",locale:"en-US"},{name:"en-US-SerenaMultilingualNeural",gender:"female",displayName:"Serena Multilingual",locale:"en-US"},{name:"en-US-SteffanMultilingualNeural",gender:"male",displayName:"Steffan Multilingual",locale:"en-US"},{name:"en-US-AIGenerate1Neural",gender:"male",displayName:"AIGenerate1",locale:"en-US"},{name:"en-US-AIGenerate2Neural",gender:"female",displayName:"AIGenerate2",locale:"en-US"},{name:"en-US-AshTurboMultilingualNeural",gender:"male",displayName:"Ash Turbo Multilingual",locale:"en-US"},{name:"en-US-BlueNeural",gender:"female",displayName:"Blue",locale:"en-US"},{name:"en-US-EvelynMultilingualNeural",gender:"female",displayName:"Evelyn Multilingual",locale:"en-US"},{name:"es-ES-ArabellaMultilingualNeural",gender:"female",displayName:"Arabella Multilingual",locale:"es-ES"},{name:"es-ES-IsidoraMultilingualNeural",gender:"female",displayName:"Isidora Multilingual",locale:"es-ES"},{name:"es-ES-TristanMultilingualNeural",gender:"male",displayName:"Tristan Multilingual",locale:"es-ES"},{name:"es-ES-XimenaMultilingualNeural",gender:"female",displayName:"Ximena Multilingual",locale:"es-ES"},{name:"es-ES-DarioNeural",gender:"male",displayName:"Dario",locale:"es-ES"},{name:"es-ES-EliasNeural",gender:"male",displayName:"Elias",locale:"es-ES"},{name:"es-ES-EstrellaNeural",gender:"female",displayName:"Estrella",locale:"es-ES"},{name:"es-ES-IreneNeural",gender:"female",displayName:"Irene",locale:"es-ES"},{name:"es-ES-LaiaNeural",gender:"female",displayName:"Laia",locale:"es-ES"},{name:"es-ES-LiaNeural",gender:"female",displayName:"Lia",locale:"es-ES"},{name:"es-ES-NilNeural",gender:"male",displayName:"Nil",locale:"es-ES"},{name:"es-ES-SaulNeural",gender:"male",displayName:"Saul",locale:"es-ES"},{name:"es-ES-TeoNeural",gender:"male",displayName:"Teo",locale:"es-ES"},{name:"es-ES-TrianaNeural",gender:"female",displayName:"Triana",locale:"es-ES"},{name:"es-ES-VeraNeural",gender:"female",displayName:"Vera",locale:"es-ES"},{name:"es-MX-DaliaMultilingualNeural",gender:"female",displayName:"Dalia Multilingual",locale:"es-MX"},{name:"es-MX-JorgeMultilingualNeural",gender:"male",displayName:"Jorge Multilingual",locale:"es-MX"},{name:"es-MX-BeatrizNeural",gender:"female",displayName:"Beatriz",locale:"es-MX"},{name:"es-MX-CandelaNeural",gender:"female",displayName:"Candela",locale:"es-MX"},{name:"es-MX-CarlotaNeural",gender:"female",displayName:"Carlota",locale:"es-MX"},{name:"es-MX-CecilioNeural",gender:"male",displayName:"Cecilio",locale:"es-MX"},{name:"es-MX-GerardoNeural",gender:"male",displayName:"Gerardo",locale:"es-MX"},{name:"es-MX-LarissaNeural",gender:"female",displayName:"Larissa",locale:"es-MX"},{name:"es-MX-LibertoNeural",gender:"male",displayName:"Liberto",locale:"es-MX"},{name:"es-MX-LucianoNeural",gender:"male",displayName:"Luciano",locale:"es-MX"},{name:"es-MX-MarinaNeural",gender:"female",displayName:"Marina",locale:"es-MX"},{name:"es-MX-NuriaNeural",gender:"female",displayName:"Nuria",locale:"es-MX"},{name:"es-MX-PelayoNeural",gender:"male",displayName:"Pelayo",locale:"es-MX"},{name:"es-MX-RenataNeural",gender:"female",displayName:"Renata",locale:"es-MX"},{name:"es-MX-YagoNeural",gender:"male",displayName:"Yago",locale:"es-MX"},{name:"eu-ES-AinhoaNeural",gender:"female",displayName:"Ainhoa",locale:"eu-ES"},{name:"eu-ES-AnderNeural",gender:"male",displayName:"Ander",locale:"eu-ES"},{name:"fi-FI-SelmaNeural",gender:"female",displayName:"Selma",locale:"fi-FI"},{name:"fr-FR-LucienMultilingualNeural",gender:"male",displayName:"Lucien Multilingual",locale:"fr-FR"},{name:"fr-FR-AlainNeural",gender:"male",displayName:"Alain",locale:"fr-FR"},{name:"fr-FR-BrigitteNeural",gender:"female",displayName:"Brigitte",locale:"fr-FR"},{name:"fr-FR-CelesteNeural",gender:"female",displayName:"Celeste",locale:"fr-FR"},{name:"fr-FR-ClaudeNeural",gender:"male",displayName:"Claude",locale:"fr-FR"},{name:"fr-FR-CoralieNeural",gender:"female",displayName:"Coralie",locale:"fr-FR"},{name:"fr-FR-JacquelineNeural",gender:"female",displayName:"Jacqueline",locale:"fr-FR"},{name:"fr-FR-JeromeNeural",gender:"male",displayName:"Jerome",locale:"fr-FR"},{name:"fr-FR-JosephineNeural",gender:"female",displayName:"Josephine",locale:"fr-FR"},{name:"fr-FR-MauriceNeural",gender:"male",displayName:"Maurice",locale:"fr-FR"},{name:"fr-FR-YvesNeural",gender:"male",displayName:"Yves",locale:"fr-FR"},{name:"fr-FR-YvetteNeural",gender:"female",displayName:"Yvette",locale:"fr-FR"},{name:"hi-IN-AaravNeural",gender:"male",displayName:"आरव ",locale:"hi-IN"},{name:"hi-IN-AnanyaNeural",gender:"female",displayName:"अनन्या",locale:"hi-IN"},{name:"hi-IN-AartiNeural",gender:"female",displayName:"आरती",locale:"hi-IN"},{name:"hi-IN-ArjunNeural",gender:"male",displayName:"अर्जुन",locale:"hi-IN"},{name:"hi-IN-KavyaNeural",gender:"female",displayName:"काव्या",locale:"hi-IN"},{name:"hi-IN-KunalNeural",gender:"male",displayName:"कुनाल ",locale:"hi-IN"},{name:"hi-IN-RehaanNeural",gender:"male",displayName:"रेहान",locale:"hi-IN"},{name:"hy-AM-AnahitNeural",gender:"female",displayName:"Անահիտ",locale:"hy-AM"},{name:"hy-AM-HaykNeural",gender:"male",displayName:"Հայկ",locale:"hy-AM"},{name:"it-IT-AlessioMultilingualNeural",gender:"male",displayName:"Alessio Multilingual",locale:"it-IT"},{name:"it-IT-IsabellaMultilingualNeural",gender:"female",displayName:"Isabella Multilingual",locale:"it-IT"},{name:"it-IT-MarcelloMultilingualNeural",gender:"male",displayName:"Marcello Multilingual",locale:"it-IT"},{name:"it-IT-CalimeroNeural",gender:"male",displayName:"Calimero",locale:"it-IT"},{name:"it-IT-CataldoNeural",gender:"male",displayName:"Cataldo",locale:"it-IT"},{name:"it-IT-FabiolaNeural",gender:"female",displayName:"Fabiola",locale:"it-IT"},{name:"it-IT-FiammaNeural",gender:"female",displayName:"Fiamma",locale:"it-IT"},{name:"it-IT-GianniNeural",gender:"male",displayName:"Gianni",locale:"it-IT"},{name:"it-IT-GiuseppeNeural",gender:"male",displayName:"Giuseppe",locale:"it-IT"},{name:"it-IT-ImeldaNeural",gender:"female",displayName:"Imelda",locale:"it-IT"},{name:"it-IT-IrmaNeural",gender:"female",displayName:"Irma",locale:"it-IT"},{name:"it-IT-LisandroNeural",gender:"male",displayName:"Lisandro",locale:"it-IT"},{name:"it-IT-PalmiraNeural",gender:"female",displayName:"Palmira",locale:"it-IT"},{name:"it-IT-PierinaNeural",gender:"female",displayName:"Pierina",locale:"it-IT"},{name:"it-IT-RinaldoNeural",gender:"male",displayName:"Rinaldo",locale:"it-IT"},{name:"ja-JP-AoiNeural",gender:"female",displayName:"碧衣",locale:"ja-JP"},{name:"ja-JP-DaichiNeural",gender:"male",displayName:"大智",locale:"ja-JP"},{name:"ja-JP-MayuNeural",gender:"female",displayName:"真夕",locale:"ja-JP"},{name:"ja-JP-NaokiNeural",gender:"male",displayName:"直紀",locale:"ja-JP"},{name:"ja-JP-ShioriNeural",gender:"female",displayName:"志織",locale:"ja-JP"},{name:"ja-JP-MasaruMultilingualNeural",gender:"male",displayName:"勝 多言語",locale:"ja-JP"},{name:"ko-KR-BongJinNeural",gender:"male",displayName:"봉진",locale:"ko-KR"},{name:"ko-KR-GookMinNeural",gender:"male",displayName:"국민",locale:"ko-KR"},{name:"ko-KR-HyunsuNeural",gender:"male",displayName:"현수",locale:"ko-KR"},{name:"ko-KR-JiMinNeural",gender:"female",displayName:"지민",locale:"ko-KR"},{name:"ko-KR-SeoHyeonNeural",gender:"female",displayName:"서현",locale:"ko-KR"},{name:"ko-KR-YuJinNeural",gender:"female",displayName:"유진",locale:"ko-KR"},{name:"nb-NO-IselinNeural",gender:"female",displayName:"Iselin",locale:"nb-NO"},{name:"or-IN-SubhasiniNeural",gender:"female",displayName:"ସୁଭାସିନୀ",locale:"or-IN"},{name:"or-IN-SukantNeural",gender:"male",displayName:"ସୁକାନ୍ତ",locale:"or-IN"},{name:"pa-IN-OjasNeural",gender:"male",displayName:"ਓਜਸ",locale:"pa-IN"},{name:"pa-IN-VaaniNeural",gender:"female",displayName:"ਵਾਨੀ",locale:"pa-IN"},{name:"pl-PL-AgnieszkaNeural",gender:"female",displayName:"Agnieszka",locale:"pl-PL"},{name:"pt-BR-MacerioMultilingualNeural",gender:"male",displayName:"Macerio Multilingual",locale:"pt-BR"},{name:"pt-BR-BrendaNeural",gender:"female",displayName:"Brenda",locale:"pt-BR"},{name:"pt-BR-DonatoNeural",gender:"male",displayName:"Donato",locale:"pt-BR"},{name:"pt-BR-ElzaNeural",gender:"female",displayName:"Elza",locale:"pt-BR"},{name:"pt-BR-FabioNeural",gender:"male",displayName:"Fabio",locale:"pt-BR"},{name:"pt-BR-GiovannaNeural",gender:"female",displayName:"Giovanna",locale:"pt-BR"},{name:"pt-BR-HumbertoNeural",gender:"male",displayName:"Humberto",locale:"pt-BR"},{name:"pt-BR-JulioNeural",gender:"male",displayName:"Julio",locale:"pt-BR"},{name:"pt-BR-LeilaNeural",gender:"female",displayName:"Leila",locale:"pt-BR"},{name:"pt-BR-LeticiaNeural",gender:"female",displayName:"Leticia",locale:"pt-BR"},{name:"pt-BR-ManuelaNeural",gender:"female",displayName:"Manuela",locale:"pt-BR"},{name:"pt-BR-NicolauNeural",gender:"male",displayName:"Nicolau",locale:"pt-BR"},{name:"pt-BR-ThalitaNeural",gender:"female",displayName:"Thalita",locale:"pt-BR"},{name:"pt-BR-ValerioNeural",gender:"male",displayName:"Valerio",locale:"pt-BR"},{name:"pt-BR-YaraNeural",gender:"female",displayName:"Yara",locale:"pt-BR"},{name:"pt-PT-FernandaNeural",gender:"female",displayName:"Fernanda",locale:"pt-PT"},{name:"sr-Latn-RS-NicholasNeural",gender:"male",displayName:"Nicholas",locale:"sr-Latn-RS"},{name:"sr-Latn-RS-SophieNeural",gender:"female",displayName:"Sophie",locale:"sr-Latn-RS"},{name:"sv-SE-HilleviNeural",gender:"female",displayName:"Hillevi",locale:"sv-SE"},{name:"th-TH-AcharaNeural",gender:"female",displayName:"อัจฉรา",locale:"th-TH"},{name:"wuu-CN-XiaotongNeural",gender:"female",displayName:"晓彤",locale:"wuu-CN"},{name:"wuu-CN-YunzheNeural",gender:"male",displayName:"云哲",locale:"wuu-CN"},{name:"zh-CN-XiaochenNeural",gender:"female",displayName:"晓辰",locale:"zh-CN"},{name:"zh-CN-XiaochenMultilingualNeural",gender:"female",displayName:"晓辰 多语言",locale:"zh-CN"},{name:"zh-CN-XiaohanNeural",gender:"female",displayName:"晓涵",locale:"zh-CN"},{name:"zh-CN-XiaomengNeural",gender:"female",displayName:"晓梦",locale:"zh-CN"},{name:"zh-CN-XiaomoNeural",gender:"female",displayName:"晓墨",locale:"zh-CN"},{name:"zh-CN-XiaoqiuNeural",gender:"female",displayName:"晓秋",locale:"zh-CN"},{name:"zh-CN-XiaorouNeural",gender:"female",displayName:"晓柔",locale:"zh-CN"},{name:"zh-CN-XiaoruiNeural",gender:"female",displayName:"晓睿",locale:"zh-CN"},{name:"zh-CN-XiaoshuangNeural",gender:"female",displayName:"晓双",locale:"zh-CN"},{name:"zh-CN-XiaoxiaoDialectsNeural",gender:"female",displayName:"晓晓 ",locale:"zh-CN"},{name:"zh-CN-XiaoxiaoMultilingualNeural",gender:"female",displayName:"晓晓 多语言",locale:"zh-CN"},{name:"zh-CN-XiaoyanNeural",gender:"female",displayName:"晓颜",locale:"zh-CN"},{name:"zh-CN-XiaoyouNeural",gender:"female",displayName:"晓悠",locale:"zh-CN"},{name:"zh-CN-XiaoyuMultilingualNeural",gender:"female",displayName:"晓宇 多语言",locale:"zh-CN"},{name:"zh-CN-XiaozhenNeural",gender:"female",displayName:"晓甄",locale:"zh-CN"},{name:"zh-CN-YunfengNeural",gender:"male",displayName:"云枫",locale:"zh-CN"},{name:"zh-CN-YunhaoNeural",gender:"male",displayName:"云皓",locale:"zh-CN"},{name:"zh-CN-YunjieNeural",gender:"male",displayName:"云杰",locale:"zh-CN"},{name:"zh-CN-YunxiaoMultilingualNeural",gender:"male",displayName:"云霄 多语言",locale:"zh-CN"},{name:"zh-CN-YunyeNeural",gender:"male",displayName:"云野",locale:"zh-CN"},{name:"zh-CN-YunyiMultilingualNeural",gender:"male",displayName:"云逸 多语言",locale:"zh-CN"},{name:"zh-CN-YunzeNeural",gender:"male",displayName:"云泽",locale:"zh-CN"},{name:"zh-CN-YunfanMultilingualNeural",gender:"male",displayName:"云帆 多语言",locale:"zh-CN"},{name:"zh-CN-guangxi-YunqiNeural",gender:"male",displayName:"云奇 广西",locale:"zh-CN"},{name:"zh-CN-henan-YundengNeural",gender:"male",displayName:"云登 河南",locale:"zh-CN"},{name:"zh-CN-liaoning-YunbiaoNeural",gender:"male",displayName:"云彪 辽宁",locale:"zh-CN"},{name:"zh-CN-shandong-YunxiangNeural",gender:"male",displayName:"云翔 山东",locale:"zh-CN"},{name:"zh-CN-sichuan-YunxiNeural",gender:"male",displayName:"云希 四川",locale:"zh-CN"}],SelfHostedVoiceList:["de-DE-AmalaNeural","de-DE-BerndNeural","de-DE-ConradNeural","de-DE-KatjaNeural","en-GB-LibbyNeural","en-GB-RyanNeural","en-GB-SoniaNeural","en-US-AmberNeural","en-US-AriaNeural","en-US-ChristopherNeural","en-US-DavisNeural","en-US-EricNeural","en-US-GuyNeural","en-US-JaneNeural","en-US-JennyNeural","en-US-MichelleNeural","en-US-SaraNeural","es-ES-AbrilNeural","es-ES-AlvaroNeural","es-ES-ArnauNeural","es-ES-ElviraNeural","fr-FR-DeniseNeural","fr-FR-HenriNeural","it-IT-BenignoNeural","it-IT-DiegoNeural","it-IT-ElsaNeural","it-IT-IsabellaNeural","ja-JP-KeitaNeural","ja-JP-NanamiNeural","ko-KR-InJoonNeural","ko-KR-SoonBokNeural","ko-KR-SunHiNeural","pt-BR-AntonioNeural","pt-BR-FranciscaNeural","pt-PT-DuarteNeural","pt-PT-RaquelNeural","ru-RU-DariyaNeural","ru-RU-DmitryNeural","ru-RU-SvetlanaNeural","yue-CN-XiaoMinNeural","yue-CN-YunSongNeural","zh-CN-henan-YundengNeural","zh-CN-liaoning-XiaobeiNeural","zh-CN-shaanxi-XiaoniNeural","zh-CN-shandong-YunxiangNeural","zh-CN-sichuan-YunxiNeural","zh-CN-XiaoxiaoNeural","zh-CN-YunxiNeural","zh-HK-HiuMaanNeural","zh-HK-WanLungNeural","zh-TW-HsiaoChenNeural","zh-TW-YunJheNeural","zf_xiaoxiao","zm_yunxi","zf_xiaoni","zf_xiaobei"],CloudDictList:[{id:"basic-english-irish",name:"Basic English-Irish Dictionary",translation:"简明英爱词典",source:"Pat Griffin"},{id:"english-italian",name:"English-Italian Dictionary",translation:"简明英意词典",source:"Pat Griffin"},{id:"cc-cedict",name:"CC-CEDICT",translation:"简明中英词典",source:"www.mdbg.net"},{id:"et-tedict",name:"ET-TEDICT",translation:"简明中英英中词典",source:"cdict-1.0-1.i386.rpm"},{id:"jmdict",name:"Japanese English Dictionary",translation:"简明日英词典",source:"JMDict"},{id:"moby",name:"Moby Thesaurus",translation:"Moby Thesaurus",source:"Chua Welic"},{id:"wordnet",name:"Wordnet",translation:"Wordnet",source:"Chua Welic"},{id:"opted",name:"Online Plain Text English Dictionary",translation:"简明英英词典",source:"Chua Welic"},{id:"english-arabic",name:"English-Arabic Dictionary",translation:"简明英阿词典",source:"Khaldoun Mahmoud"},{id:"tcm_textbook",name:"中医教材仓库",translation:"中医教材仓库",source:"Fredrik Jornebo"},{id:"ecdict",name:"ECDICT",translation:"简明英汉字典增强版",source:"GitHub-skywind3000"}]};class x{constructor(e){this.config=e,this.driveId="",this.taskQueue=new k(1),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getDriveId(){return m(this,void 0,void 0,(function*(){if(this.driveId)return this.driveId;const a=this.config.access_token,t=yield e.post("https://openapi.alipan.com/adrive/v1.0/user/getDriveInfo",{},{headers:{Authorization:`Bearer ${a}`}});return this.driveId=t.data.default_drive_id,this.driveId}))}getFolderIdByPath(a){return m(this,void 0,void 0,(function*(){const t=this.config.access_token,o=yield this.getDriveId();try{try{const i=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(i.data)return i.data.file_id}catch(i){const n=a.split("/").filter((e=>e));let r="",l="root";for(const a of n){r+="/"+a;try{l=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:r},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id}catch(i){l=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:o,parent_file_id:l,name:a,type:"folder",check_name_mode:"refuse"},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id}}return l}}catch(e){return console.error("Error getting/creating folder by path:",e),""}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=yield this.getDriveId(),i=yield this.getFolderIdByPath(this.baseFolder+"/"+a);let n=[],r="",l=!0;for(;l;){const a=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/list",{drive_id:o,parent_file_id:i,marker:r||void 0},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}),s=a.data.items.filter((e=>!e.punish_flag||2!==e.punish_flag))||[];n=n.concat(s),r=a.data.next_marker,l=!!r}return[...new Set(n.map((e=>({name:e.name,size:e.size,type:e.type,modified:e.updated_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=yield this.getDriveId(),i=yield this.getFolderIdByPath(this.baseFolder+"/"+a);return!i||(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/delete",{drive_id:o,file_id:i},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}checkExists(a){var t;return m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=yield this.getDriveId(),n=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:i,file_path:a},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}});(null===(t=n.data)||void 0===t?void 0:t.file_id)&&(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/recyclebin/trash",{drive_id:i,file_id:n.data.file_id},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}))}catch(e){}}))}getAuthUrl(e){return`https://openapi.alipan.com/oauth/authorize?${new URLSearchParams({response_type:"code",client_id:C.adriveClientId,redirect_uri:e,grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}).toString()}`}}class I extends x{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=yield this.getDriveId(),n=t.substring(0,t.lastIndexOf("/")),r=t.substring(t.lastIndexOf("/")+1);yield this.deleteFileWithoutQueue(t);const l=yield this.getFolderIdByPath(this.baseFolder+"/"+n),s=yield a.arrayBuffer(),d=s.byteLength,c=yield crypto.subtle.digest("SHA-1",s),u=Array.from(new Uint8Array(c)).map((e=>e.toString(16).padStart(2,"0"))).join(""),m=(e=>{function a(e,a){const t=(65535&e)+(65535&a);return(e>>16)+(a>>16)+(t>>16)<<16|65535&t}function t(e,t,o,i,n,r){return a((l=a(a(t,e),a(i,r)))<<(s=n)|l>>>32-s,o);var l,s}function o(e,a,o,i,n,r,l){return t(a&o|~a&i,e,a,n,r,l)}function i(e,a,o,i,n,r,l){return t(a&i|o&~i,e,a,n,r,l)}function n(e,a,o,i,n,r,l){return t(a^o^i,e,a,n,r,l)}function r(e,a,o,i,n,r,l){return t(o^(a|~i),e,a,n,r,l)}const l=function(e){const a=e.length,t=1+(a+8>>6),o=new Array(16*t).fill(0);for(let t=0;t>2]|=e.charCodeAt(t)<>2]|=128<{let a="";for(let t=0;t<4;t++)a+=("0"+(e>>8*t&255).toString(16)).slice(-2);return a})).join("")})(o),p=Number(BigInt("0x"+m.slice(0,16))%BigInt(d||1)),h=new Uint8Array(s.slice(p,Math.min(p+8,d))),g=btoa(String.fromCharCode(...h)),f=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:i,parent_file_id:l,name:r,type:"file",check_name_mode:"ignore",size:d,content_hash:u,content_hash_name:"sha1",proof_code:g,proof_version:"v1",part_info_list:[{part_number:1}]},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}),{file_id:y,upload_id:N,rapid_upload:v,part_info_list:b}=f.data;return v?(console.info("阿里云盘秒传成功"),!0):(yield fetch(b[0].upload_url,{method:"PUT",body:s,headers:{"Content-Length":d.toString()}}),yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/complete",{drive_id:i,file_id:y,upload_id:N},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=yield this.getDriveId(),i=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:this.baseFolder+"/"+a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id,n=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/getDownloadUrl",{drive_id:o,file_id:i},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return(yield e.get(n.data.url,{responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}})).data}catch(e){return console.error("Error downloading file:",e),!1}}))))))}}class F{constructor(e){this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getFolderIdByPath(a){return m(this,void 0,void 0,(function*(){if(""==a)return"0";const t=this.config.access_token,o=a.split("/");let i="0";for(const a of o){const o=`https://api.box.com/2.0/folders/${i}/items?fields=id,name&type=folder&limit=1000`;try{const n=(yield e.get(o,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===a&&"folder"===e.type));if(n)i=n.id;else{const o={name:a,parent:{id:i},type:"folder"};i=(yield e.post("https://api.box.com/2.0/folders",o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.id}}catch(e){return console.error("Error occurred during folder creation:",e),""}}return i}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);let i=yield this.getFolderIdByPath(o),n=[],r=0,l=!0;const s=1e3;for(;l;){const a=yield e.get(`https://api.box.com/2.0/folders/${i}/items`,{params:{limit:s,offset:r},headers:{Authorization:`Bearer ${t}`}}),o=a.data.entries||[];n=n.concat(o),r+=o.length,l=o.length===s&&a.data.total_count>r}return[...new Set(n.map((e=>({name:e.name,size:e.size||0,type:e.type,modified:e.content_modified_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=a.substring(0,a.lastIndexOf("/")),i=a.substring(a.lastIndexOf("/")+1);let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const r=yield this.getFolderIdByPath(n);if(!r)return!0;const l=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=file&limit=1000`,s=(yield e.get(l,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===i&&"file"===e.type));return!s||(yield e.delete(`https://api.box.com/2.0/files/${s.id}`,{headers:{Authorization:`Bearer ${t}`}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://account.box.com/api/oauth2/authorize?${new URLSearchParams({response_type:"code",client_id:C.boxClientId,redirect_uri:e,grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}).toString()}`}}class R extends F{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=t.substring(0,t.lastIndexOf("/")),n=t.substring(t.lastIndexOf("/")+1);let r=this.baseFolder+"/"+i;for(;r.startsWith("/");)r=r.substring(1);const l=yield this.getFolderIdByPath(r);if(!l)throw new Error("Folder not found");const s=(yield this.listFiles(i)).find((e=>e===n));s&&(yield this.deleteFileWithoutQueue(i+"/"+n));let d=new File([a],n,{lastModified:(new Date).getTime(),type:a.type});const c=new FormData;c.append("file",d),c.append("parent_id",l);const u=yield e.post("https://upload.box.com/api/2.0/files/content",c,{headers:{Authorization:`Bearer ${o}`,"Content-Type":"multipart/form-data"},params:{if_match:"false",fields:"name,id"},maxContentLength:1/0,maxBodyLength:1/0});return!(u.status>=300)||(console.error("Error occurred during file upload:",u),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=a.substring(0,a.lastIndexOf("/")),i=a.substring(a.lastIndexOf("/")+1);let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const r=yield this.getFolderIdByPath(n);if(!r)return console.error("Folder not found"),!0;const l=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=file&limit=1000`,s=(yield e.get(l,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===i&&"file"===e.type));if(!s)return console.error("File not found:",i),!0;const d=yield e({url:`https://api.box.com/2.0/files/${s.id}/content`,method:"get",headers:{Authorization:`Bearer ${t}`},responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return d.status>=300?(console.error("Error occurred during file download:",d),!1):d.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class O{constructor(e){this.config=e,this.taskQueue=new k(3)}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=[],i=!0,n=null;for(;i;){let r;r=n?yield e.post("https://api.dropboxapi.com/2/files/list_folder/continue",{cursor:n},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}):yield e.post("https://api.dropboxapi.com/2/files/list_folder",{path:"/"+a,limit:2e3},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});const l=r.data.entries||[];o=o.concat(l),i=r.data.has_more,n=r.data.cursor}return[...new Set(o.map((e=>({name:e.name,size:e.size||0,type:e[".tag"],modified:e.client_modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;yield e.post("https://api.dropboxapi.com/2/files/delete_v2",{path:"/"+a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://www.dropbox.com/oauth2/authorize?response_type=code&token_access_type=offline&client_id=${C.dropboxClientId}&redirect_uri=${e}`}}class _ extends O{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type});const r=yield e.post("https://content.dropboxapi.com/2/files/upload",n,{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/octet-stream","Dropbox-API-Arg":JSON.stringify({path:"/"+t,mode:"overwrite",autorename:!0,mute:!1})},maxContentLength:1/0,maxBodyLength:1/0});return!(r.status>=300)||(console.error("Error occurred during file upload:",r),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=yield e({url:"https://content.dropboxapi.com/2/files/download",method:"post",headers:{Authorization:`Bearer ${t}`,"Dropbox-API-Arg":JSON.stringify({path:"/"+a})},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return o.status>=300?(console.error("Error occurred during file download:",o),!1):o.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ${constructor(e){this.folderExistsCache=new Set,this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){var t,o;return m(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);let n=[],r=0;const l=1e3;let s=!0;for(;s;){const d=yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:a?`/${a}`:"/",limit:l,offset:r,fields:"_embedded.items.name,_embedded.items.size,_embedded.items.type,_embedded.items.modified,_embedded.total"}}),c=(null===(t=d.data._embedded)||void 0===t?void 0:t.items)||[];n=n.concat(c);const u=(null===(o=d.data._embedded)||void 0===o?void 0:o.total)||0;r+=c.length,s=r({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);const o=yield e.delete("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${t}`,"Content-Type":"application/json"},params:{path:a?`/${a}`:"/",permanently:!1}});return 202===o.status||204===o.status}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(a){var t,o;return m(this,void 0,void 0,(function*(){try{const i=this.config.access_token,n=a.split("/").filter((e=>e.length>0));let r="";for(const a of n)if(r+="/"+a,!this.folderExistsCache.has(r))try{yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:r}}),this.folderExistsCache.add(r)}catch(a){if(404!==(null===(t=a.response)||void 0===t?void 0:t.status))return console.error("Error checking directory:",a),!1;try{yield e.put(`https://cloud-api.yandex.net/v1/disk/resources?path=${encodeURIComponent(r)}`,null,{headers:{Authorization:`OAuth ${i}`}}),this.folderExistsCache.add(r)}catch(e){if(409!==(null===(o=e.response)||void 0===o?void 0:o.status))return console.error("Error creating directory:",e),!1;this.folderExistsCache.add(r)}}return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}getAuthUrl(e){return`https://oauth.yandex.com/authorize?response_type=code&client_id=${C.yandexClientId}&redirect_uri=${e}&force_confirm=true`}}class M extends ${constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=this.baseFolder+"/"+t;for(;i.startsWith("/");)i=i.substring(1);const n=i.substring(0,i.lastIndexOf("/"));if(n){if(!(yield this.ensureDirectoryExists(n)))return console.error("Failed to create directory:",n),!1}const r=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/upload",{headers:{Authorization:`OAuth ${o}`,"Content-Type":"application/json"},params:{path:`/${i}`,overwrite:!0}});if(200!==r.status)return console.error("Error getting upload URL:",r),!1;const l=r.data.href;let s=t.split("/").pop()||"",d=new File([a],s,{lastModified:(new Date).getTime(),type:a.type});const c=yield e.put(l,d,{headers:{"Content-Type":a.type||"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0});return!(c.status>=300)||(console.error("Error occurred during file upload:",c),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);const i=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/download",{headers:{Authorization:`OAuth ${t}`,"Content-Type":"application/json"},params:{path:`/${o}`}});if(200!==i.status)return console.error("Error getting download URL:",i),!1;const n=i.data.href,r=yield e({url:n,method:"get",maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return r.status>=300?(console.error("Error occurred during file download:",r),!1):r.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class U{constructor(e){this.isExp=!1,this.folderIdCache=new Map,this.config=e,this.taskQueue=new k(3),this.isExp=this.config.isExp||!1,this.baseFolder="KoodoReader"}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getFileId(a,t){return m(this,void 0,void 0,(function*(){const o=this.config.access_token,i=`https://www.googleapis.com/drive/v3/files?q=name='${a}'+and+'${t}'+in+parents&fields=files(id,name)`;try{const a=yield e.get(i,{headers:{Authorization:"Bearer "+o}});if(0===a.data.files.length)return"";const t=a.data.files;return t.length>0?t[0].id:null}catch(e){return console.error("Error occurred during file list retrieval:",e),""}}))}checkFolder(a){return m(this,void 0,void 0,(function*(){a=this.baseFolder+"/"+a;const t=this.config.access_token;if(""===a)return"root";if(this.folderIdCache.has(a))return this.folderIdCache.get(a);const o=a.split("/").filter((e=>""!==e.trim()));let i="root",n="";for(const a of o){if(n=n?n+"/"+a:a,this.folderIdCache.has(n)){i=this.folderIdCache.get(n);continue}let o=yield this.getFolderId(a,i);if(!o){const n={name:a,mimeType:"application/vnd.google-apps.folder",parents:[i]};try{o=(yield e.post("https://www.googleapis.com/drive/v3/files",n,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.id}catch(e){throw console.error(`Error occurred during folder creation for ${a}:`,e),e}}this.folderIdCache.set(n,o),i=o}return i}))}getFolderId(a,t){return m(this,void 0,void 0,(function*(){const o=this.config.access_token,i=`https://www.googleapis.com/drive/v3/files?q=name='${a=encodeURIComponent(a)}'+and+mimeType='application/vnd.google-apps.folder'+and+'${t}'+in+parents&fields=files(id,name)`;try{const a=(yield e.get(i,{headers:{Authorization:`Bearer ${o}`}})).data.files;return a.length>0?a[0].id:null}catch(e){throw console.error("Error occurred during fetching folder ID:",e),e}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=yield this.checkFolder(a),i=[],n="",r=!0;for(;r;){let a=`https://www.googleapis.com/drive/v3/files?q='${o}'+in+parents&fields=nextPageToken,files(id,name,size,mimeType)&pageSize=1000`;n&&(a+=`&pageToken=${n}`);const l=yield e.get(a,{headers:{Authorization:`Bearer ${t}`}}),s=l.data.files||[];i=i.concat(s),n=l.data.nextPageToken,r=!!n}return[...new Set(i.map((e=>({name:e.name,size:e.size||0,type:"application/vnd.google-apps.folder"===e.mimeType?"folder":"file",modified:e.modifiedTime}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQue(e)}))))))}))}deleteFileWithoutQue(a){return m(this,void 0,void 0,(function*(){const t=a.split("/").pop()||"",o=a.split("/").slice(0,-1).join("/"),i=yield this.checkFolder(o),n=this.config.access_token,r=yield this.getFileId(t,i);if(""===r)return console.error("File not found:",t),!0;try{const a=yield e.delete(`https://www.googleapis.com/drive/v3/files/${r}`,{headers:{Authorization:`Bearer ${n}`}});return console.error("File deleted:",a),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${e}&prompt=consent&response_type=code&client_id=${C.googleClientId}&scope=https://www.googleapis.com/auth/${this.isExp?"drive":"drive.file"}&access_type=offline`}}class B extends U{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type}),r=t.split(".").pop(),l=p(r||""),s=t.split("/")[0],d=yield this.checkFolder(s),c=yield this.getFileId(i||"",d);const u={mimeType:l,name:i,parents:[d]},m=c?`https://www.googleapis.com/upload/drive/v3/files/${c}?uploadType=resumable`:"https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable",h=(yield e({method:c?"PATCH":"POST",url:m,data:c?null:JSON.stringify(u),headers:{Authorization:"Bearer "+o,"Content-Type":"application/json; charset=UTF-8"},maxContentLength:1/0,maxBodyLength:1/0})).headers.location,g=yield this.getData(n);if(0===Object.keys(g).length)return!1;const f=yield e.put(h,g.data,{headers:{Authorization:"Bearer "+o,"Content-Type":"application/zip","Content-Range":`bytes 0-${g.fileSize-1}/${g.fileSize}`},maxContentLength:1/0,maxBodyLength:1/0});return!(f.status>=300)||(console.error("Error occurred during file download:",f),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=a.split("/").pop(),i=a.split("/")[0],n=yield this.checkFolder(i),r=yield this.getFileId(o||"",n);if(!r)return console.error("File not found:",o),!0;const l=`https://www.googleapis.com/drive/v3/files/${r}?alt=media`,s=yield e.get(l,{headers:{Authorization:"Bearer "+t},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return s.status>=300?(console.error("Error occurred during file download:",s),!1):s.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getData(e){return m(this,void 0,void 0,(function*(){return e?new Promise(((a,t)=>{const o=new FileReader;o.onload=t=>a({fileName:e.name,mimeType:e.type,fileSize:e.size,data:t.target.result}),o.onerror=e=>t(e),o.readAsArrayBuffer(e)})):{}}))}}class z{constructor(e){this.folderCreationLocks=new Map,this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=2){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getStorage(){return m(this,void 0,void 0,(function*(){if(this.storage)return this.storage;let{email:e,password:t}=this.config;return this.storage=yield new a({email:e,password:t,userAgent:"KoodoReader/1.0"}).ready,this.storage}))}getRoot(){return m(this,void 0,void 0,(function*(){if(this.root)return this.root;const e=(yield this.getStorage()).root;if(""===this.baseFolder)return this.root=e,this.root;let a=e.children.find((e=>e.name===this.baseFolder&&e.directory));return a||(a=yield e.mkdir(this.baseFolder)),this.root=a,this.root}))}createFolder(e,a){return m(this,void 0,void 0,(function*(){const t=`${e.nodeId}_${a}`;if(this.folderCreationLocks.has(t))return yield this.folderCreationLocks.get(t);const o=(()=>m(this,void 0,void 0,(function*(){try{let t=e.children.find((e=>e.name===a&&e.directory));return t||(t=yield e.mkdir(a),t)}finally{this.folderCreationLocks.delete(t)}})))();return this.folderCreationLocks.set(t,o),yield o}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){try{let a=yield this.getRoot();if(e){const t=e.split("/").filter((e=>e));for(const e of t){const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return[];a=t}}return a.children.map((e=>({name:e.name,size:e.size||0,type:e.directory?"folder":"file",modified:e.timestamp?new Date(1e3*e.timestamp).toISOString():""})))}catch(e){return console.error("Error listing MEGA files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return m(this,void 0,void 0,(function*(){try{let a=yield this.getRoot();const t=e.split("/"),o=t.pop();for(const e of t){if(!e)continue;const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return!0;a=t}const i=a.children.find((e=>e.name===o&&!e.directory));return!i||(yield i.delete(),!0)}catch(e){return console.error("Error deleting MEGA file:",e),!1}}))}}class D extends z{constructor(e){super(e)}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{let o=yield this.getRoot();const i=a.split("/"),n=i.pop()||"";for(const e of i){if(!e)continue;let a=o.children.find((a=>a.name===e&&a.directory));a||(a=yield this.createFolder(o,e)),o=a}const r=new File([e],n,{lastModified:(new Date).getTime(),type:e.type}),l=yield e.arrayBuffer(),s=new Uint8Array(l),d=t.from(s),c=o.children.find((e=>e.name===n&&!e.directory));return c&&(yield c.delete()),yield o.upload({name:n,size:r.size},d).complete,!0}catch(e){return console.error("Error occurred during MEGA file upload:",e),!1}}))))))}))}downloadFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let a=yield this.getRoot();const t=e.split("/"),o=t.pop()||"";for(const e of t){if(!e)continue;const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return!0;a=t}const i=a.children.find((e=>e.name===o&&!e.directory));if(!i)return!0;const n=yield i.downloadBuffer();return this.taskQueue.setDownloadedSize(n.size),n.buffer}catch(e){return console.error("Error occurred during MEGA file download:",e),!1}}))))))}))}}class L{constructor(e){this.isExp=!1,this.baseUrl="https://graph.microsoft.com/v1.0/me/drive/special/approot",this.config=e,this.taskQueue=new k(3),this.isExp=this.config.isExp||!1,this.baseUrl=this.isExp?"https://graph.microsoft.com/v1.0/me/drive/root":"https://graph.microsoft.com/v1.0/me/drive/special/approot",void 0===this.config.baseFolder?this.baseFolder=this.isExp?"KoodoReader":"":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);let o,i=[];if(""===a)o=`${this.baseUrl}/children`;else{const e=encodeURIComponent(a);o=`${this.baseUrl}:/${e}:/children`}for(;o;){const a=yield e.get(o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(a.status>=300)break;const n=a.data.value||[];i=i.concat(n),o=a.data["@odata.nextLink"]||""}return[...new Set(i.map((e=>({name:e.name,size:e.size||0,type:e.folder?"folder":"file",modified:e.lastModifiedDateTime}))))]}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);const o=yield e.delete(`${this.baseUrl}:/${a}`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return!(o.status>=300)||(console.error("Error deleting file:",o),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${C.microsoftClientId}&scope=${this.isExp?"files.readwrite.all":"files.readwrite.appfolder"} offline_access&response_type=code&redirect_uri=${e}`}}class P extends L{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type}),r=this.baseFolder+"/"+t;for(;r.startsWith("/");)r=r.substring(1);const l=this.baseUrl+":/"+r+":/createUploadSession",s=yield e.post(l,null,{headers:{Authorization:"Bearer "+o,"Content-Type":"application/json"},maxContentLength:1/0,maxBodyLength:1/0});let d=n.size;const c=n.type,u=s.data.uploadUrl,m=yield e.put(u,n,{headers:{"Content-Type":c,"Content-Range":`bytes 0-${d-1}/${d}`},maxContentLength:1/0,maxBodyLength:1/0});return!(m.status>=300)||(console.error("Error occurred during file download:",m),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);const i=`${this.baseUrl}:/${o}:/content`,n=yield e.get(i,{responseType:"arraybuffer",headers:{Authorization:"Bearer "+t},maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error occurred during file download:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class j{downloadFile(e,a){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}listFiles(e){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e([])}))}))}getAuthUrl(){return""}}class K{constructor(e){this.baseUrl="https://api.pcloud.com",this.config=e,this.taskQueue=new k(3),this.baseUrl="2"===e.region?"https://eapi.pcloud.com":"https://api.pcloud.com"}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}checkFolderExists(a,t){return m(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:t,path:`/${a}`}})).data.result}catch(e){return console.error("Error checking folder:",e),!1}}))}createFolder(a,t){return m(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/createfolderifnotexists`,{params:{access_token:t,path:`/${a}`}})).data.result}catch(e){return console.error("Error creating folder:",e),!1}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:t,path:"/"+a,recursive:0}});return 0!==o.data.result?[]:o.data.metadata.contents.map((e=>({name:e.name,size:e.size||0,type:e.isfolder?"folder":"file",modified:e.modified})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/deletefile`,{params:{access_token:t,path:"/"+a}});return 0===o.data.result||(console.error("Error deleting file:",o.data),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://my.pcloud.com/oauth2/authorize?client_id=${C.pcloudClientId}&response_type=code&redirect_uri=${e}`}}class H extends K{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.refresh_token,i=t.split("/").slice(0,-1).join("/");if(!(yield this.checkFolderExists(i,o))){if(!(yield this.createFolder(i,o)))return!1}let n=t.split("/").pop()||"",r=new File([a],n,{lastModified:(new Date).getTime(),type:a.type});const l=new FormData;l.append("file",r);const s=yield e.post(`${this.baseUrl}/uploadfile`,l,{params:{access_token:o,path:`/${i}`,renew:1},maxContentLength:1/0,maxBodyLength:1/0});return 0===s.data.result||(console.error("Error uploading file:",s.data),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/getfilelink`,{params:{access_token:t,path:`/${a}`}});if(0!==o.data.result)return console.error("Error getting file link:",o.data),!0;const i=`https://${o.data.hosts[0]}${o.data.path}`,n=yield e.get(i,{responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error downloading file:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class J{constructor(e){this.config=e,this.taskQueue=new k(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=0){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}shouldUsePathStyle(){try{if(this.config.forcePathStyle&&"no"!==this.config.forcePathStyle)return!0;let e=this.config.endpoint;const a=new URL(e),t=a.hostname,o=/^(\d{1,3}\.){3}\d{1,3}$/.test(t),i=""!==a.port;return!o&&i}catch(e){return!0}}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){let{endpoint:a,region:t,bucketName:n,accessKeyId:r,secretAccessKey:l,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;let d=s+"/"+e;for(;d.startsWith("/");)d=d.substring(1);""===d||d.endsWith("/")||(d+="/");const c=new o({endpoint:a,region:t,credentials:{accessKeyId:r,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});try{let e,a=[],t=[],o=!0;for(;o;){const r=yield c.send(new i({Bucket:n,Prefix:d,Delimiter:"/",ContinuationToken:e}));r.Contents&&(a=a.concat(r.Contents)),r.CommonPrefixes&&(t=t.concat(r.CommonPrefixes)),e=r.NextContinuationToken,o=!!e}let r=[];return a.forEach((e=>{if(!e.Key.endsWith("/")){const a=e.Key.substring(d.length);a.includes("/")||r.push({name:a,size:e.Size||0,type:"file",modified:e.LastModified?e.LastModified.toISOString():""})}})),t.forEach((e=>{const a=e.Prefix.substring(d.length).replace(/\/$/,"");a&&r.push({name:a,size:0,type:"folder",modified:""})})),r}catch(e){return console.error(e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){let{endpoint:a,region:t,bucketName:i,accessKeyId:r,secretAccessKey:l,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;const d=new o({endpoint:a,region:t,credentials:{accessKeyId:r,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});let c=s+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{return yield d.send(new n({Bucket:i,Key:c})),!0}catch(e){return console.error(e),!1}}))}}class W extends J{constructor(e){super(e)}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:n,accessKeyId:l,secretAccessKey:s,dir:d}=this.config;const c=new o({endpoint:t,region:i,credentials:{accessKeyId:l,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});d=d&&"KoodoReader"===this.baseFolder?d:this.baseFolder;let u=d+"/"+a;for(;u.startsWith("/");)u=u.substring(1);try{let a=yield c.send(new r({Bucket:n,Key:u,Body:e}));return 200===a.$metadata.httpStatusCode||(console.error("Error uploading file:",a),!1)}catch(e){return console.error("Error: ",e),!1}}))))))}))}downloadFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let{endpoint:a,region:t,bucketName:i,accessKeyId:n,secretAccessKey:r,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;const d=new o({endpoint:a,region:t,credentials:{accessKeyId:n,secretAccessKey:r},forcePathStyle:this.shouldUsePathStyle()});let c=s+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{const e=yield d.send(new l({Bucket:i,Key:c}));if(!e.Body)return console.error("No response body"),!1;const a=yield e.Body.transformToByteArray();return this.taskQueue.setDownloadedSize(a.length),a.buffer}catch(a){return console.error("Error downloading file:",a,e),!1}}))))))}))}}class q{constructor(e){this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder;a&&""!==a.trim()&&(o=o+"/"+a),o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));let i=[],n=0;const r=1e3;for(;;){const a=yield e.get("https://pan.baidu.com/rest/2.0/xpan/file",{params:{method:"list",access_token:t,dir:"/"+o,start:n,limit:r,order:"name",desc:0,web:1,folder:0},headers:{"User-Agent":"pan.baidu.com"}});if(a.status>=300||0!==a.data.errno){console.error("百度网盘API错误:",a.data);break}const l=a.data.list||[];if(0===l.length)break;if(i=i.concat(l),l.length({name:e.server_filename,size:e.size||0,type:e.isdir?"folder":"file",modified:new Date(1e3*e.server_mtime).toISOString(),path:e.path,fs_id:e.fs_id})))}catch(e){return console.error("获取百度网盘文件列表时发生错误:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));const i=new URLSearchParams({async:"0",filelist:JSON.stringify(["/"+o])}),n=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=filemanager&access_token=${t}&opera=delete`,i.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==n.data.errno)return console.error("百度网盘删除文件API错误:",n.data),-9===n.data.errno?console.error("文件不存在"):111===n.data.errno?console.error("有其他异步任务正在执行"):-7===n.data.errno&&console.error("文件名非法"),!1;const r=n.data.info||[];for(const e of r)if(0!==e.errno)return console.error(`文件删除失败: ${e.path}, 错误码: ${e.errno}`),!1;return!0}catch(e){return console.error("删除文件时发生错误:",e),!1}}))}getAuthUrl(e){return`https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=${C.duboxClientId}&redirect_uri=${e}&scope=basic,netdisk&device_id=119827642&display=page&qrcode=1`}}const G=4194304;class Q extends q{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var o;try{const o=this.config.access_token;let i=this.baseFolder+"/"+t;i=i.replace(/\/+/g,"/"),i.startsWith("/")&&(i=i.substring(1));const n=yield a.arrayBuffer(),r=n.byteLength,l=new Uint8Array(n),{contentMd5:s,sliceMd5:d,blockList:c}=this.calculateFileMd5(l,r),u=new URLSearchParams({path:"/"+i,size:r.toString(),isdir:"0",autoinit:"1",rtype:"3",block_list:JSON.stringify(c),"content-md5":s,"slice-md5":d,local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),m=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=${o}`,u.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==m.data.errno)return console.error("预上传失败:",m.data),!1;const p=m.data.uploadid,h=m.data.block_list||[];if(0===h.length)return!0;const g=yield this.getUploadDomain(o,"/"+i,p);if(!g)return console.error("获取上传域名失败"),!1;for(const a of h){const t=a*G,n=Math.min(G,r-t),s=l.slice(t,t+n),d=new FormData;d.append("file",new Blob([s],{type:"application/octet-stream"}),`chunk_${a}`);const u=`${g}/rest/2.0/pcs/superfile2?method=upload&access_token=${o}&type=tmpfile&path=${encodeURIComponent("/"+i)}&uploadid=${p}&partseq=${a}`,m=yield e.post(u,d,{headers:{"User-Agent":"pan.baidu.com"},maxContentLength:1/0,maxBodyLength:1/0,timeout:0});if(m.status>=300)throw new Error(`分片上传失败: ${JSON.stringify(m.data)}`);const h=m.data.md5,f=c[a];h&&h!==f&&console.warn(`分片 ${a} MD5不匹配: 期望 ${f}, 实际 ${h}`)}const f=new URLSearchParams({path:"/"+i,size:r.toString(),isdir:"0",block_list:JSON.stringify(c),uploadid:p,rtype:"3",local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),y=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${o}`,f.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});return 0===y.data.errno||(console.error("创建文件失败:",y.data),!1)}catch(e){return console.error("文件上传过程中发生错误:",(null===(o=e.response)||void 0===o?void 0:o.data)||e.message||e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var t;this.taskQueue.setDownloadedSize(0);try{const o=this.config.access_token;let i=this.baseFolder+"/"+a;i=i.replace(/\/+/g,"/"),i.startsWith("/")&&(i=i.substring(1));const n=yield this.listFileInfos(a.substring(0,a.lastIndexOf("/"))),r=i.split("/").pop(),l=n.find((e=>e.name===r));if(!l)return console.error("文件不存在:",a),!1;const s=yield e.get("https://pan.baidu.com/rest/2.0/xpan/multimedia",{params:{method:"filemetas",access_token:o,fsids:JSON.stringify([l.fs_id]),dlink:1},headers:{"User-Agent":"pan.baidu.com"}});if(0!==s.data.errno||!(null===(t=s.data.list)||void 0===t?void 0:t[0]))return console.error("获取下载链接失败:",s.data),!1;const d=s.data.list[0].dlink;return(yield e.get(d,{responseType:"arraybuffer",params:{access_token:o},headers:{"User-Agent":"pan.baidu.com"},onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}})).data}catch(e){return console.error("下载文件时发生错误:",e),!1}}))))))}))}getUploadDomain(a,t,o){return m(this,void 0,void 0,(function*(){try{const i=yield e.get("https://d.pcs.baidu.com/rest/2.0/pcs/file",{params:{method:"locateupload",appid:"250528",access_token:a,path:t,uploadid:o,upload_version:"2.0"},headers:{"User-Agent":"pan.baidu.com"}});if(0!==i.data.error_code)return console.error("获取上传域名失败:",i.data),null;const n=i.data.servers||[],r=n.find((e=>e.server.startsWith("https://")));return r?r.server:n.length>0?n[0].server:(console.error("没有可用的上传服务器"),null)}catch(e){return console.error("获取上传域名时出错:",e),null}}))}calculateFileMd5(e,a){const t=[];let o="",i=0;for(;i=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getUploadCredentials(a){return m(this,void 0,void 0,(function*(){try{const t=yield e.get(`${this.baseUrl}/open/upload/get_token`,{headers:{Authorization:`Bearer ${a}`}});return t.status>=300||!t.data.state?(console.error("Error getting upload credentials:",t.data),null):t.data.data}catch(e){return console.error("Error occurred during get upload credentials:",e),null}}))}generateOSSPolicy(e,a,t=new Date(Date.now()+36e5)){const o={expiration:t.toISOString(),conditions:[{bucket:e},{key:a},["starts-with","$success_action_status","2"],["content-length-range",0,1073741824]]};return JSON.stringify(o)}getAuthUrl(e){return`https://passportapi.115.com/open/authorize?client_id=${C.yiyiwuClientId}&response_type=code&redirect_uri=${e}`}}class X extends Y{constructor(e){super(e)}sha1Hex(e){return m(this,void 0,void 0,(function*(){const a=yield crypto.subtle.digest("SHA-1",e);return Array.from(new Uint8Array(a)).map((e=>e.toString(16).padStart(2,"0"))).join("")}))}calculateFileSha1(e){return m(this,void 0,void 0,(function*(){try{const a=yield e.arrayBuffer();return this.sha1Hex(a)}catch(e){return console.error("Error calculating file SHA1:",e),""}}))}calculatePreSha1(e){return m(this,void 0,void 0,(function*(){try{const a=e.slice(0,131072),t=yield a.arrayBuffer();return this.sha1Hex(t)}catch(e){return console.error("Error calculating pre SHA1:",e),""}}))}calculateOSSSignature(e,a){const t=s.enc.Base64.stringify(s.enc.Utf8.parse(a));return s.HmacSHA1(t,e).toString(s.enc.Base64)}handleSecondAuth(e,a,t,o,i,n,r,l){return m(this,void 0,void 0,(function*(){try{if(!a.sign_check)return console.error("No sign_check provided for second authentication"),null;const[s,d]=a.sign_check.split("-"),c=parseInt(s),u=parseInt(d),m=t.slice(c,u+1),p=yield m.arrayBuffer(),h=(yield this.sha1Hex(p)).toUpperCase();return yield this.initializeUpload(e,o,i,n,r,l,a.sign_key,h,a.pick_code)}catch(e){return console.error("Error during second authentication:",e),null}}))}uploadToObjectStorage(a,t,o,i){var n;return m(this,void 0,void 0,(function*(){try{const n=i.endpoint,r=o.bucket,l=o.object;let s;if(n.includes(r))s=n;else{s=`https://${r}.${n.replace(/^https?:\/\//,"")}`}const d=this.generateOSSPolicy(r,l),c=this.calculateOSSSignature(i.AccessKeySecret,d),u=btoa(d),m=new FormData;if(m.append("key",l),m.append("policy",u),m.append("OSSAccessKeyId",i.AccessKeyId),m.append("signature",c),m.append("x-oss-security-token",i.SecurityToken),m.append("success_action_status","200"),o.callback&&o.callback.callback){const e=btoa(o.callback.callback);if(m.append("callback",e),o.callback.callback_var){const e=JSON.parse(o.callback.callback_var);for(const[a,t]of Object.entries(e))m.append(a,String(t))}}const p=new File([a],t,{type:a.type});m.append("file",p);const h=yield e.post(s,m,{maxContentLength:1/0,maxBodyLength:1/0});return 200===h.status||204===h.status||(console.error("Upload failed with status:",h.status),!1)}catch(e){return console.error("Error uploading file via REST API:",(null===(n=e.response)||void 0===n?void 0:n.data)||e.message||e),!1}}))}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var t;try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;o.startsWith("/")||(o="/"+o);const i=e.size,n=yield this.calculateFileSha1(e),r=yield this.calculatePreSha1(e),l=a.split("/").pop()||a,s=o.substring(0,o.lastIndexOf("/"))||"/";let d=yield this.getFolderInfo(s,!0),c="0";if(d)c=d.file_id;else{let e=yield this.createFolder(s);if(!e)return console.error("Failed to create folder:",s),!1;c=e}yield this.deleteFileWithoutQueue(a);let u=yield this.initializeUpload(c,l,i,n,r,t);if(!u)return console.error("Failed to initialize upload"),!1;if((6===u.status||7===u.status||8===u.status)&&(u=yield this.handleSecondAuth(c,u,e,l,i,n,r,t),!u))return console.error("Second authentication failed"),!1;if(2===u.status)return console.info(`File ${a} uploaded successfully via instant upload.`),!0;const m=yield this.getUploadCredentials(t);if(!m)return console.error("Failed to get upload credentials"),!1;return(yield this.uploadToObjectStorage(e,l,u,m))?(console.info(`File ${a} uploaded successfully.`),!0):(console.error("Failed to upload to object storage"),!1)}catch(e){return console.error("Error occurred during file upload:",(null===(t=e.response)||void 0===t?void 0:t.data)||e.message||e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let t=this.baseFolder+"/"+a;t=t.replace(/\/+/g,"/"),t.startsWith("/")||(t="/"+t);const o=yield this.getFolderInfo(t,!1);if(!o||!o.pick_code)return console.error("Failed to get file info or pick_code for:",a),!1;const i=yield this.getFileDownloadUrl(o.pick_code);if(!i)return console.error("Failed to get download URL for:",a),!1;const n=yield e.get(i.url,{responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error downloading file:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}initializeUpload(a,t,o,i,n,r,l,s,d){return m(this,void 0,void 0,(function*(){try{const c=new FormData;c.append("file_name",t),c.append("file_size",o.toString()),a?c.append("target","U_1_"+a):c.append("target","U_1_0"),c.append("fileid",i),c.append("preid",n),c.append("topupload","0"),d&&c.append("pick_code",d),l&&c.append("sign_key",l),s&&c.append("sign_val",s);const u=yield e.post(`${this.baseUrl}/open/upload/init`,c,{headers:{Authorization:`Bearer ${r}`,"Content-Type":"multipart/form-data"}});return u.status>=300||!u.data.state?(console.error("Error initializing upload:",u.data),null):u.data.data}catch(e){return console.error("Error occurred during upload initialization:",e),null}}))}createFolder(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=a.replace(/^\/+|\/+$/g,"");if(!o)return"";const i=o.split("/");let n="",r="0";for(const a of i){n=n?`${n}/${a}`:a;const o=yield this.getFolderInfo(n,!0);if(o&&o.file_id)r=o.file_id;else{const o=new FormData;o.append("pid",r),o.append("file_name",a);const i=yield e.post(`${this.baseUrl}/open/folder/add`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});if(i.status>=300||!i.data.state)return console.error("Error creating folder:",i.data),"";r=i.data.data.file_id}}return r}catch(e){return console.error("Error occurred during folder creation:",e),""}}))}getFolderInfo(a,t){return m(this,void 0,void 0,(function*(){if(""===a||"/"===a)return{file_id:"0"};a.startsWith("/")||(a="/"+a);try{const t=this.config.access_token,o=new FormData;o.append("path",a);const i=yield e.post(`${this.baseUrl}/open/folder/get_info`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});return i.status>=300||!i.data.state||0===i.data.data.length?(console.error("Error getting file info:",i.data),null):i.data.data}catch(e){return console.error("Error occurred during get file info:",e),null}}))}getFileDownloadUrl(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=new FormData;o.append("pick_code",a);const i=yield e.post(`${this.baseUrl}/open/ufile/downurl`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});if(i.status>=300)return console.error("Error getting download URL:",i.data),null;const n=i.data.data,r=Object.keys(n)[0];return r&&n[r]?n[r].url:(console.error("No file data found in download URL response"),null)}catch(e){return console.error("Error occurred during get download URL:",e.message||e),null}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;(a=this.baseFolder+"/"+a).startsWith("/")||(a="/"+a);let o=[],i=0;const n=1150;let r=!0,l=yield this.getFolderInfo(a,!0),s="";if(l)s=l.file_id;else{let e=yield this.createFolder(a);if(!e)return console.error("Failed to create folder:",a),[];s=e}if(!s)return console.error("Failed to get or create folder ID:",a),[];let d=s;for(;r;){const a={offset:i,limit:n,cur:1,show_dir:1};d&&(a.cid=d);const l=yield e.get(`${this.baseUrl}/open/ufile/files`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},params:a});if(l.status>=300)break;const s=l.data.data||[];o=o.concat(s),s.length({name:e.fn,size:e.fs||0,type:"0"===e.fc?"folder":"file",modified:new Date(1e3*e.upt).toISOString()})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;a=this.baseFolder+"/"+a;const o=yield this.getFolderInfo(a,!1);if(!o)return!0;const i=new FormData;i.append("file_ids",o.file_id);const n=yield e.post(`${this.baseUrl}/open/ufile/delete`,i,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});return!(n.status>=300||!n.data.state)||(console.error("Error deleting file:",n),!1)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}}class V{constructor(e){let{username:a,password:t,url:o,dir:i,AuthType:n,createClient:r}=e;void 0===e.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=e.baseFolder,i=i&&"KoodoReader"===this.baseFolder?i:this.baseFolder,this.username=a,this.password=t,this.url=o,this.dir=i,this.taskQueue=new k(5),this.AuthType=n,this.createClient=r}getClient(){return m(this,void 0,void 0,(function*(){return this.webdavClient||(this.url=yield this.handleUrlRedirection(this.url),this.webdavClient=this.createClient(this.url,{authType:this.AuthType.Password,username:this.username,password:this.password})),this.webdavClient}))}handleUrlRedirection(a){return m(this,void 0,void 0,(function*(){try{const t=yield e.head(a,{maxRedirects:0,validateStatus:()=>!0,timeout:5e3});return t.request&&t.request.responseURL&&t.request.responseURL!==a?t.request.responseURL:t.status>=300&&t.status<400&&t.headers.location?t.headers.location:a}catch(e){return console.info("Error handling URL redirection:",e),a}}))}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){const a=yield this.getClient();try{const t=a.getDirectoryContents(this.dir+"/"+e),o=new Promise(((e,a)=>{setTimeout((()=>a(new Error("WebDAV list directory timeout"))),5e3)}));return(yield Promise.race([t,o])).filter((a=>"."!==a.filename&&".."!==a.filename&&a.filename!==e)).map((e=>({name:e.basename,size:e.size||0,type:"directory"===e.type?"folder":"file",modified:e.lastmod})))}catch(t){return t.response&&404===t.response.status&&(yield a.createDirectory(this.dir+"/"+e)),console.error("Error listing files:",t),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){const a=yield this.getClient();try{return yield a.deleteFile(this.dir+"/"+e),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(e){return m(this,void 0,void 0,(function*(){let a=yield this.getClient();try{const t=e.replace(/^\/+|\/+$/g,"").split("/").filter((e=>e.length>0));let o="";for(const e of t)o=o?`${o}/${e}`:e,(yield a.exists(`/${o}`))||(yield a.createDirectory(`/${o}`));return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}}class Z extends V{constructor(e){super(Object.assign(Object.assign({},e),{AuthType:d,createClient:c}))}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{let o=this.dir+"/"+t,i=yield this.getClient();const n=i.exists(o.substring(0,o.lastIndexOf("/"))),r=new Promise(((e,a)=>{setTimeout((()=>a(new Error("WebDAV exists check timeout"))),5e3)}));!1===(yield Promise.race([n,r]))&&(yield this.ensureDirectoryExists(o.substring(0,o.lastIndexOf("/"))));let l=t.split("/").pop()||"",s=new File([a],l,{lastModified:(new Date).getTime(),type:a.type}),d=i.getFileUploadLink(this.dir+"/"+t);const c=new URL(d);c.search="",d=c.toString();const u=btoa(this.username+":"+this.password),m=yield e.put(d,s,{headers:{Authorization:"Basic "+u},maxContentLength:1/0,maxBodyLength:1/0});return!(m.status>=300)||(console.error("Error occurred during file upload:",m),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){if(this.taskQueue.setDownloadedSize(0),-1===a.indexOf("."))return new ArrayBuffer(0);try{const t=btoa(this.username+":"+this.password);let o=this.url.endsWith("/")?this.url:this.url+"/",i=this.dir.startsWith("/")?this.dir.substring(1):this.dir;const n=yield e({url:o+i+"/"+a,method:"get",headers:{Authorization:"Basic "+t},responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error occurred during file download:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ee{constructor(e){this.username=e.username,this.password=e.password,this.url=e.url,this.taskQueue=new k(3)}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{return(yield e.get(`${this.url}/list`,{params:{dir:a},auth:{username:this.username,password:this.password}})).data.files.map((e=>({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modifiedTime})))||[]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{return(yield e.delete(`${this.url}/delete`,{params:{dir:a.split("/").slice(0,-1).join("/")||"",filename:a.split("/").pop()},auth:{username:this.username,password:this.password}})).data.success}catch(e){return console.error("Error deleting file:",e),!1}}))}}class ae extends ee{constructor(e){super(e)}getAuthHeader(){return`Basic ${btoa(`${this.username}:${this.password}`)}`}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=t.split("/").pop()||"",i=t.substring(0,t.lastIndexOf("/"))||"";let n=this.listFiles("");const r=new Promise(((e,a)=>{setTimeout((()=>a(new Error("Docker connection timeout"))),5e3)}));yield Promise.race([n,r]);let l=new File([a],o,{lastModified:(new Date).getTime(),type:a.type});const s=new FormData;s.append("file",l);const d=yield e.post(`${this.url}/upload?dir=${encodeURIComponent(i)}`,s,{headers:{Authorization:this.getAuthHeader(),"Content-Type":"multipart/form-data"},maxContentLength:1/0,maxBodyLength:1/0});return!(d.status>=300)||(console.error("Error occurred during file upload:",d),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=a.split("/").pop()||"",o=a.substring(0,a.lastIndexOf("/"))||"",i=yield e({url:`${this.url}/download`,method:"GET",params:{dir:o,filename:t},headers:{Authorization:this.getAuthHeader()},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return i.status>=300?(console.error("Error occurred during file download:",i),!1):i.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}const te=["book","config","cover","font"];class oe{constructor(e,a){this.type=e,this.remote="dropbox"===e?new _(a):"microsoft"===e?new P(a):"google"===e?new B(a):"microsoft_exp"===e?new P(Object.assign(Object.assign({},a),{isExp:!0})):"google_exp"===e?new B(Object.assign(Object.assign({},a),{isExp:!0})):"s3compatible"===e?new W(a):"webdav"===e?new Z(a):"docker"===e?new ae(a):"boxnet"===e?new R(a):"mega"===e?new D(a):"adrive"===e?new I(a):"pcloud"===e?new H(a):"dubox"===e?new Q(a):"yandex"===e?new M(a):"yiyiwu"===e?new X(a):new j}downloadFile(e,a){return m(this,void 0,void 0,(function*(){if("cover"!==a){if(!(yield this.listFiles(a)).find((a=>e.indexOf(a)>-1)))return!1}return yield this.remote.downloadFile(a+"/"+e)}))}uploadFile(e,a,t){return m(this,void 0,void 0,(function*(){return 0===t.size||(yield this.remote.uploadFile(t,a+"/"+e))}))}deleteFile(e,a){return m(this,void 0,void 0,(function*(){return!(yield this.listFiles(a)).find((a=>e.indexOf(a)>-1))||(yield this.remote.deleteFile(a+"/"+e))}))}listFiles(e){return m(this,void 0,void 0,(function*(){return yield this.remote.listFiles(e)}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){return yield this.remote.listFileInfos(e)}))}isExist(e,a){return m(this,void 0,void 0,(function*(){return(yield this.listFiles(a)).find((a=>-1!==a.indexOf(e)))}))}downloadAllFiles(){return m(this,void 0,void 0,(function*(){for(let e of te){let a=yield this.listFiles(e);for(let t of a)yield this.downloadFile(t,e)}}))}getAuthUrl(e){return this.remote.getAuthUrl?this.remote.getAuthUrl(e):""}getStats(){return this.remote.taskQueue.getStats()}clearQueue(){return this.remote.taskQueue.clearQueue()}resetCounters(){this.remote.taskQueue.resetCounters()}getDownloadedSize(){return this.remote.taskQueue.getDownloadedSize()}}const ie={words:['ALTER TABLE words ADD COLUMN "sentence" text']},ne={notes:"SELECT * FROM notes WHERE key = ?",bookmarks:"SELECT * FROM bookmarks WHERE key = ?",books:"SELECT * FROM books WHERE key = ?",plugins:"SELECT * FROM plugins WHERE key = ?",words:"SELECT * FROM words WHERE key = ?"},re={notes:"SELECT * FROM notes WHERE bookKey = ?",bookmarks:"SELECT * FROM bookmarks WHERE bookKey = ?",words:"SELECT * FROM words WHERE bookKey = ?",books:"SELECT * FROM books WHERE key = ?"},le={notes:"DELETE FROM notes WHERE bookKey = ?",bookmarks:"DELETE FROM bookmarks WHERE bookKey = ?",words:"DELETE FROM words WHERE bookKey = ?"};function se(e){for(const a in e)e.hasOwnProperty(a)&&(e[`temp-${a}`]=e[a]);return e}const de={notes:e=>{let a=Object.assign({},e);return a.date=JSON.parse(e.date),a.tag=JSON.parse(e.tag),a},bookmarks:e=>e,books:e=>e,plugins:e=>{let a=Object.assign({},e);return e.autoValue||delete a.autoValue,e.langList?a.langList=JSON.parse(e.langList):delete a.langList,e.voiceList?a.voiceList=JSON.parse(e.voiceList):delete a.voiceList,a.config=JSON.parse(e.config),a},words:e=>{let a=Object.assign({},e);return a.date=JSON.parse(e.date),void 0===a.sentence&&(a.sentence=""),a}};var ce={sqlStatement:{createTableStatement:se({notes:'\n CREATE TABLE IF NOT EXISTS "notes" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "chapter" text,\n "chapterIndex" integer,\n "text" text,\n "cfi" text,\n "range" text,\n "notes" text,\n "percentage" text,\n "color" integer,\n "tag" array\n )\n ',bookmarks:'\n CREATE TABLE IF NOT EXISTS "bookmarks" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "cfi" text,\n "label" text,\n "percentage" text,\n "chapter" text\n );\n ',books:'\n CREATE TABLE IF NOT EXISTS "books" (\n "key" text PRIMARY KEY,\n "name" text,\n "author" text,\n "description" text,\n "md5" text,\n "cover" text,\n "format" text,\n "publisher" text,\n "size" integer,\n "page" integer,\n "path" text,\n "charset" text\n );\n ',plugins:'\n CREATE TABLE IF NOT EXISTS "plugins" (\n "key" text PRIMARY KEY,\n "type" text,\n "displayName" text,\n "icon" text,\n "version" text,\n "config" object,\n "autoValue" string,\n "langList" text,\n "voiceList" text,\n "scriptSHA256" text,\n "script" text\n );\n ',words:'\n CREATE TABLE IF NOT EXISTS "words" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "word" text,\n "sentence" text,\n "chapter" text\n );\n '}),migrateStatement:se(ie),getAllStatement:se({notes:"SELECT * FROM notes",bookmarks:"SELECT * FROM bookmarks",books:"SELECT * FROM books",plugins:"SELECT * FROM plugins",words:"SELECT * FROM words"}),getPagedStatement:se({notes:"SELECT * FROM notes LIMIT ? OFFSET ?",bookmarks:"SELECT * FROM bookmarks LIMIT ? OFFSET ?",books:"SELECT * FROM books LIMIT ? OFFSET ?",plugins:"SELECT * FROM plugins LIMIT ? OFFSET ?",words:"SELECT * FROM words LIMIT ? OFFSET ?"}),getCountStatement:se({notes:"SELECT COUNT(*) as count FROM notes",bookmarks:"SELECT COUNT(*) as count FROM bookmarks",books:"SELECT COUNT(*) as count FROM books",plugins:"SELECT COUNT(*) as count FROM plugins",words:"SELECT COUNT(*) as count FROM words"}),saveStatement:se({notes:"INSERT OR REPLACE INTO notes (key, bookKey, chapter, chapterIndex, text, cfi, range, notes, date, percentage, color, tag) VALUES (@key, @bookKey, @chapter, @chapterIndex, @text, @cfi, @range, @notes, @date, @percentage, @color, @tag)",bookmarks:"INSERT OR REPLACE INTO bookmarks (key, bookKey, cfi, label, percentage, chapter) VALUES (@key, @bookKey, @cfi, @label, @percentage, @chapter)",books:"INSERT OR REPLACE INTO books (key, name, author, description, md5, cover, format, publisher, size, page, path, charset) VALUES (@key, @name, @author, @description, @md5, @cover, @format, @publisher, @size, @page, @path, @charset)",plugins:"INSERT OR REPLACE INTO plugins (key, type, displayName, icon, version, config, autoValue, langList, voiceList, scriptSHA256, script) VALUES (@key, @type, @displayName, @icon, @version, @config, @autoValue, @langList, @voiceList, @scriptSHA256, @script)",words:"INSERT OR REPLACE INTO words (key, bookKey, date, word, sentence, chapter) VALUES (@key, @bookKey, @date, @word, @sentence, @chapter)"}),deleteAllStatement:se({notes:"DELETE FROM notes",bookmarks:"DELETE FROM bookmarks",books:"DELETE FROM books",plugins:"DELETE FROM plugins",words:"DELETE FROM words"}),updateStatement:se({notes:"UPDATE notes SET bookKey = @bookKey, chapter = @chapter, chapterIndex = @chapterIndex, text = @text, cfi = @cfi, range = @range, notes = @notes, date = @date, percentage = @percentage, color = @color, tag = @tag WHERE key = @key",bookmarks:"UPDATE bookmarks SET bookKey = @bookKey, cfi = @cfi, label = @label, percentage = @percentage, chapter = @chapter WHERE key = @key",books:"UPDATE books SET name = @name, author = @author, description = @description, md5 = @md5, cover = @cover, format = @format, publisher = @publisher, size = @size, page = @page, path = @path, charset = @charset WHERE key = @key",plugins:"UPDATE plugins SET type = @type, displayName = @displayName, icon = @icon, version = @version, config = @config, autoValue = @autoValue, langList = @langList, voiceList = @voiceList, scriptSHA256 = @scriptSHA256, script = @script WHERE key = @key",words:"UPDATE words SET bookKey = @bookKey, date = @date, word = @word, sentence = @sentence, chapter = @chapter WHERE key = @key"}),deleteStatement:se({notes:"DELETE FROM notes WHERE key = ?",bookmarks:"DELETE FROM bookmarks WHERE key = ?",books:"DELETE FROM books WHERE key = ?",plugins:"DELETE FROM plugins WHERE key = ?",words:"DELETE FROM words WHERE key = ?"}),dropStatement:se({notes:"DROP TABLE IF EXISTS notes",bookmarks:"DROP TABLE IF EXISTS bookmarks",books:"DROP TABLE IF EXISTS books",plugins:"DROP TABLE IF EXISTS plugins",words:"DROP TABLE IF EXISTS words"}),getStatement:se(ne),getByBookKeyStatement:se(re),getByBookKeysStatement:se({notes:e=>`SELECT * FROM notes WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,bookmarks:e=>`SELECT * FROM bookmarks WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,words:e=>`SELECT * FROM words WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")})`}),getKeysStatement:se({notes:"SELECT key FROM notes",bookmarks:"SELECT key FROM bookmarks",books:"SELECT key FROM books",plugins:"SELECT key FROM plugins",words:"SELECT key FROM words"}),getWithSortAndPageStatement:se({notes:(e,a,t,o)=>`SELECT * FROM notes ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,bookmarks:(e,a,t,o)=>`SELECT * FROM bookmarks ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,books:(e,a,t,o)=>`SELECT * FROM books ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,plugins:(e,a,t,o)=>`SELECT * FROM plugins ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,words:(e,a,t,o)=>`SELECT * FROM words ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`}),getByKeysStatement:se({notes:e=>`SELECT * FROM notes WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,bookmarks:e=>`SELECT * FROM bookmarks WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,plugins:e=>`SELECT * FROM plugins WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,words:e=>`SELECT * FROM words WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`}),deleteByBookKeyStatement:se(le)},jsonToSqlite:se({notes:e=>{let a=Object.assign({},e);return a.date=JSON.stringify(e.date),a.tag=JSON.stringify(e.tag),a},bookmarks:e=>e,books:e=>{let a=Object.assign({},e);return a.page=e.page||0,a},plugins:e=>{let a=Object.assign({},e);return e.autoValue||(a.autoValue=null),e.langList?a.langList=JSON.stringify(e.langList):a.langList=null,e.voiceList?a.voiceList=JSON.stringify(e.voiceList):a.voiceList=null,a.config=JSON.stringify(e.config),a},words:e=>{let a=Object.assign({},e);return a.date=JSON.stringify(e.date),void 0===a.sentence&&(a.sentence=""),a}}),sqliteToJson:se(de)};const ue=E.cloudUrl,me=E.cloudCNUrl;class pe{constructor(e,a,t){this.TokenService=e,this.ConfigService=a,this.baseUrl="china"===t?me:ue,this.serverRegion=t,this.refreshToken="",this.accessToken="",this.streamPromise=null,this.expiresAt=0}refreshUserToken(){return m(this,void 0,void 0,(function*(){if(this.refreshToken=yield this.TokenService.getToken("refresh_token"),!this.refreshToken)return{code:401,message:"refresh token not found"};let a=(yield e.post(this.baseUrl+"/api/v1/public/user/refresh_token",{refresh_token:this.refreshToken})).data;return 200===a.code&&(yield this.TokenService.setToken("access_token",a.data.access_token),yield this.TokenService.setToken("refresh_token",a.data.refresh_token),yield this.TokenService.setToken("expires_at",(1e3*a.data.expires_at).toString()),this.accessToken=a.data.access_token,this.refreshToken=a.data.refresh_token,this.expiresAt=1e3*a.data.expires_at),a}))}requestWithRetry(e){return m(this,void 0,void 0,(function*(){return pe.requestQueue||(pe.requestQueue=[]),new Promise(((a,t)=>{pe.requestQueue.push({config:e,resolve:a,reject:t}),pe.processingQueue||this.processQueue()}))}))}isTokenValid(){return m(this,void 0,void 0,(function*(){if(this.accessToken||(this.accessToken=(yield this.TokenService.getToken("access_token"))||""),!this.expiresAt){const e=yield this.TokenService.getToken("expires_at");this.expiresAt=e?parseInt(e):(new Date).getTime()+31536e9}return""!==this.accessToken&&this.expiresAt>(new Date).getTime()+6e4}))}processQueue(){return m(this,void 0,void 0,(function*(){if(!pe.processingQueue){pe.processingQueue=!0;try{for(;pe.requestQueue.length>0;){const e=pe.requestQueue.shift();try{let a=yield this.executeRequest(e.config);e.resolve(a)}catch(a){e.reject(a)}}}finally{pe.processingQueue=!1}}}))}executeRequest(a){return m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let t="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);if(a.baseURL=this.baseUrl,a.headers)a.headers.Authorization="Bearer "+this.accessToken,a.headers["X-Request-ID"]=t;else{let e=this.ConfigService.getItem("appVersion"),o=this.ConfigService.getItem("appPlatform");a.headers={Authorization:"Bearer "+this.accessToken,"X-Request-ID":t,"X-App-Version":e||"1.0.0","X-App-Platform":o||"web"}}let o=(yield e(a)).data;if(402===o.code){let t=yield this.refreshUserToken();if(200===t.code){return a.headers=a.headers||{},a.headers.Authorization="Bearer "+this.accessToken,(yield e(a)).data}return t}return 200!==o.code&&console.error("Request error:",o),o}catch(e){return console.error("Request execution error:",e),"Network Error"===e.message?{code:503,message:"network error",data:null,msg:"Network error, please try again later. 网络错误,请稍后再试。"}:{code:500,message:e.message||"Unknown error",msg:e.message||"Unknown error",data:null}}}))}requestWithStream(e,a,t){return m(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let o=this.accessToken||"",i="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((n,r)=>{let l=this.ConfigService.getItem("appVersion"),s=this.ConfigService.getItem("appPlatform");const d=new t(this.baseUrl+e.url,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+o,"X-Request-ID":i,"X-App-Version":l||"1.0.0","X-App-Platform":s||"web"},method:e.method,body:JSON.stringify(e.data),pollingInterval:0});d.addEventListener("open",(()=>{console.info("Connection to OpenAI established.")})),d.addEventListener("message",(e=>m(this,void 0,void 0,(function*(){if(!e.data)return;const t=JSON.parse(e.data);t.done?(d.close(),n(t)):a(t.data)})))),d.addEventListener("error",(e=>{if(console.info("Error:",e),!e.data)return;const a=JSON.parse(e.data);n(a),d.close()}))}))}finally{this.streamPromise=null}})))()),this.streamPromise}))}requestWithFetch(e,a){return m(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let t=this.accessToken||"",o="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((i,n)=>m(this,void 0,void 0,(function*(){let n=this.ConfigService.getItem("appVersion"),r=this.ConfigService.getItem("appPlatform");var l=new u(this.baseUrl+e.url,{headers:{"Content-Type":"text/plain",Authorization:"Bearer "+t,"X-Request-ID":o,"X-App-Version":n||"1.0.0","X-App-Platform":r||"web"},payload:JSON.stringify(e.data),method:"POST"});l.addEventListener("message",(e=>m(this,void 0,void 0,(function*(){if(!e.data)return;const t=JSON.parse(e.data);t.done?(l.close(),i(t)):a(t.data)})))),l.addEventListener("open",(e=>{console.info(e,"Connection to OpenAI established.")})),l.addEventListener("error",(e=>{if(console.error(e,"Error occurred while connecting to OpenAI"),!e.data)return;const a=JSON.parse(e.data);i(a),l.close()}))}))))}finally{this.streamPromise=null}})))()),this.streamPromise}))}}pe.processingQueue=!1,pe.requestQueue=[];class he extends pe{constructor(e,a,t){super(e,a,t)}getTransStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_trans_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getTransFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_trans_stream",data:e};return yield this.requestWithFetch(t,a)}))}getDictionary(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_dict",data:e};return yield this.requestWithRetry(a)}))}getBatchTrans(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_batch_trans",data:e};return yield this.requestWithRetry(a)}))}getSplitSentence(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_split_sentence",data:e};return yield this.requestWithRetry(a)}))}getAnswerStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_answer_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getAnswerFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_answer_stream",data:e};return yield this.requestWithFetch(t,a)}))}getSummaryStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_sum_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getSummaryFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_sum_stream",data:e};return yield this.requestWithFetch(t,a)}))}getDictionaryStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_dict_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getDictionaryFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_dict_stream",data:e};return yield this.requestWithFetch(t,a)}))}getGoogleFont(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_google_font",data:e};return yield this.requestWithRetry(a)}))}sendToKindle(e,a){return m(this,void 0,void 0,(function*(){let t=new FormData;t.append("file",e.file),t.append("email",e.email),t.append("file_name",e.fileName);const o={method:"post",url:"/api/v1/pro/reader/send_to_kindle",headers:{"Content-Type":"multipart/form-data"},data:t,onUploadProgress:a?t=>{var o;const i=t.total||(null===(o=e.file)||void 0===o?void 0:o.size)||0;i>0&&a(Math.min(t.loaded/i,1))}:void 0};return yield this.requestWithRetry(o)}))}detectLanguage(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/detect_language",data:e};return yield this.requestWithRetry(a)}))}getTTSAudio(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_tts_audio",data:e};return yield this.executeRequest(a)}))}getOcrResult(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_ocr_result",data:e};return yield this.executeRequest(a)}))}getOcrResultV2(e){return m(this,void 0,void 0,(function*(){let a=new FormData;a.append("file",e.file);const t={method:"post",url:"/api/v1/pro/reader/get_ocr_result_v2",headers:{"Content-Type":"multipart/form-data"},data:a};return yield this.executeRequest(t)}))}analyzeText(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/analyze_text",data:e};return yield this.requestWithRetry(a)}))}getBookMetadata(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_book_metadata",data:e};return yield this.requestWithRetry(a)}))}analyzeBookTitle(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/analyze_book_title",data:e};return yield this.requestWithRetry(a)}))}}class ge extends pe{constructor(e,a,t){super(e,a,t),this.serverRegion=t}encryptToken(e){return m(this,void 0,void 0,(function*(){let a=e.token,t=v.encode(a),{extracted:o,remaining:i}=function(e){let a="",t="",o=[],i=1;for(;i<=e.length;)o.push(i-1),i*=2;for(let i=0;i-1){let t=a.split("#");e.encrypted_token=t[1]}const t={method:"post",url:"/api/v1/pro/thirdparty/decrypt_token",data:e};let o=yield this.requestWithRetry(t);if(a.indexOf("#")>-1&&o.data&&o.data.token){let e=a.split("#"),t=function(e,a){let t="",o=[],i=1,n=e.length+a.length;for(;i<=n;)o.push(i-1),i*=2;let r=0,l=0;for(let i=0;i{let o="";if("github"===e?o=`https://github.com/login/oauth/authorize?client_id=${C.githubClientId}&redirect_uri=${t}&scope=${T.github.scopes.join(" ")}&response_type=code`:"google"===e?o=`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${t}&prompt=consent&response_type=code&client_id=${C.googleClientId}&scope=${T.google.scopes.join(" ")}&access_type=offline`:"facebook"===e?o=`https://www.facebook.com/v12.0/dialog/oauth?client_id=${C.facebookClientId}&redirect_uri=${t}&scope=&response_type=code`:"microsoft"===e&&(o=`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${C.microsoftClientId}&scope=${T.microsoft.scopes.join(" ")}&response_type=code&redirect_uri=${t}`),"manual"===a)return o;let i=JSON.stringify({deeplink:"desktop"===a?"koodo-reader://callback":"browser"===a?`${C.callbackUrl}#/login`:"",service:e});return`${o}&state=${"state|"+encodeURIComponent(i)}`}};class Ne{static CompareDatabase(e,a,t){return m(this,void 0,void 0,(function*(){let o=Object.keys(e).filter((e=>e.startsWith("database.sqlite.books"))),i=Object.keys(e).filter((e=>e.startsWith("database.sqlite.notes"))),n=Object.keys(e).filter((e=>e.startsWith("database.sqlite.bookmarks"))),r=Object.keys(e).filter((e=>e.startsWith("database.sqlite.plugins"))),l=Object.keys(e).filter((e=>e.startsWith("database.sqlite.words"))),s=Object.keys(a).filter((e=>e.startsWith("database.sqlite.books"))),d=Object.keys(a).filter((e=>e.startsWith("database.sqlite.notes"))),c=Object.keys(a).filter((e=>e.startsWith("database.sqlite.bookmarks"))),u=Object.keys(a).filter((e=>e.startsWith("database.sqlite.plugins"))),m=Object.keys(a).filter((e=>e.startsWith("database.sqlite.words"))),p={books:Array.from(new Set(o.concat(s))),notes:Array.from(new Set(i.concat(d))),bookmarks:Array.from(new Set(n.concat(c))),plugins:Array.from(new Set(r.concat(u))),words:Array.from(new Set(l.concat(m)))},h={books:{save:[],update:[],delete:[],conflict:[],upload:[]},notes:{save:[],update:[],delete:[],conflict:[],upload:[]},bookmarks:{save:[],update:[],delete:[],conflict:[],upload:[]},plugins:{save:[],update:[],delete:[],conflict:[],upload:[]},words:{save:[],update:[],delete:[],conflict:[],upload:[]}},g=["books","notes","bookmarks","plugins","words"];for(let o of g)for(let i of p[o]){let n=i.split(".")[3],r=e[i],l=a[i];r?l?("save"===l.operation&&("update"!==r.operation&&"delete"!==r.operation||h[o].upload.push(n)),"delete"===l.operation&&("save"===r.operation&&(h[o].delete.push(n),e[i]=l),"update"===r.operation&&(r.timel.time&&(h[o].conflict.push(n),"cloud"===t?(h[o].delete.push(n),e[i]=l):h[o].upload.push(n))),r.operation),"update"===l.operation&&("save"===r.operation&&(h[o].update.push(n),e[i]=l),"update"===r.operation&&(r.timel.time&&h[o].upload.push(n)),"delete"===r.operation&&(r.timel.time&&h[o].upload.push(n)))):h[o].upload.push(n):(h[o].save.push(n),e[i]=l)}return{compareResult:h,syncRecords:e}}))}static CompareConfig(e,a,t){return m(this,void 0,void 0,(function*(){let o=Object.keys(e).filter((e=>e.startsWith("config.readerConfig"))),i=Object.keys(e).filter((e=>e.startsWith("config.listConfig"))),n=Object.keys(e).filter((e=>e.startsWith("config.objectConfig"))),r=Object.keys(e).filter((e=>e.startsWith("config.mapConfig"))),l=Object.keys(a).filter((e=>e.startsWith("config.readerConfig"))),s=Object.keys(a).filter((e=>e.startsWith("config.listConfig"))),d=Object.keys(a).filter((e=>e.startsWith("config.objectConfig"))),c=Object.keys(a).filter((e=>e.startsWith("config.mapConfig"))),u={readerConfig:Array.from(new Set(o.concat(l))),listConfig:Array.from(new Set(i.concat(s))),objectConfig:Array.from(new Set(n.concat(d))),mapConfig:Array.from(new Set(r.concat(c)))},m={readerConfig:{update:[],upload:[]},listConfig:{update:[],upload:[]},objectConfig:{update:[],delete:[],conflict:[],save:[],upload:[]},mapConfig:{update:[],delete:[],conflict:[],save:[],upload:[]}},p=["readerConfig","listConfig"];for(let t of p)for(let o of u[t]){let i=o,n=e[o],r=a[o];n?r?n.timer.time&&m[t].upload.push(i):m[t].upload.push(i):(m[t].update.push(i),e[o]=r)}let h=["objectConfig","mapConfig"];for(let o of h)for(let i of u[o]){let n=i,r=e[i],l=a[i];r?l?("delete"===l.operation&&("update"===r.operation&&(r.timel.time&&(m[o].conflict.push(n),"cloud"===t?(m[o].delete.push(n),e[i]=l):m[o].upload.push(n))),r.operation),"update"===l.operation&&("update"===r.operation&&(r.timel.time&&m[o].upload.push(n)),"delete"===r.operation&&(r.timel.time&&m[o].upload.push(n)))):m[o].upload.push(n):(m[o].update.push(n),e[i]=l)}return{compareResult:m,syncRecords:e}}))}static compareAll(e,a,t,o,i){return m(this,void 0,void 0,(function*(){let n="cloud";if("yes"===t.getReaderConfig("isKeepLocal")){n="local";let e=t.getObjectConfig(yield o.getFingerprint(),"cloudSyncTime",{time:0,conflictMode:"cloud"}),a=yield i.getCloudConfig("config"),r=JSON.parse(a.cloudSyncTime||"{}");delete r[yield o.getFingerprint()],Object.values(r).filter((a=>"local"===a.conflictMode&&a.time>e.time)).length>0&&(n="cloud")}let{compareResult:r,syncRecords:l}=yield this.CompareDatabase(e,a,n),{compareResult:s,syncRecords:d}=yield this.CompareConfig(l,a,n),c=Object.assign(Object.assign({},r),s);return t.setAllSyncRecord(d),"local"===n&&(c.books.conflict.length>0||c.notes.conflict.length>0||c.bookmarks.conflict.length>0||c.plugins.conflict.length>0||c.words.conflict.length>0||c.objectConfig.conflict.length>0||c.mapConfig.conflict.length>0)?t.setObjectConfig(yield o.getFingerprint(),{time:(new Date).getTime(),conflictMode:"local"},"cloudSyncTime"):t.setObjectConfig(yield o.getFingerprint(),{time:(new Date).getTime(),conflictMode:"cloud"},"cloudSyncTime"),c}))}static startSync(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){let r=yield this.syncConfig(e,a,t,i,n,o);if(e.books.save.length>0||e.books.upload.length>0){let e=yield this.syncCover(a,n,i),t=yield this.syncBook(a,i);return[...r,...e,...t]}return r}))}static syncConfig(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){let r=[];for(let a of h){if(e[a].save.length+e[a].update.length>0){let o=yield n.getCloudDatabase(a);for(let i of e[a].save){let e=o.find((e=>e.key===i));e&&(yield t.saveRecord(e,a))}for(let i of e[a].update){let e=o.find((e=>e.key===i));e&&(yield t.updateRecord(e,a,!1))}}if(e[a].delete.length>0)for(let n of e[a].delete)"books"===a&&(yield o.deleteOfflineBook(n),yield i.deleteOfflineCover(n)),yield t.deleteRecord(n,a);yield t.dumpDatabase(a,!0)}if(e.readerConfig.update.length>0||e.listConfig.update.length>0||e.objectConfig.update.length>0||e.mapConfig.update.length>0){let t=yield n.getCloudConfig("config");for(let o of e.readerConfig.update){let e=o.split(".")[3];t.readerConfig&&a.setReaderConfig(e,JSON.parse(t.readerConfig)[e],!1)}for(let o of e.listConfig.update){let e=o.split(".")[3];t[e]&&a.setAllListConfig(JSON.parse(t[e]),e,!1)}for(let o of e.objectConfig.update){let e=o.split(".")[3],i=o.split(".")[2];t[i]&&JSON.parse(t[i])&&JSON.parse(t[i])[e]&&a.setObjectConfig(e,JSON.parse(t[i])[e],i,!1)}for(let o of e.mapConfig.update){let e=o.split(".")[3],i=o.split(".")[2];if(t[i]&&JSON.parse(t[i])&&JSON.parse(t[i])[e]){let o=JSON.parse(t[i])[e];a.setOneMapConfig(e,o,i,!1)}}}if(e.objectConfig.delete.length>0||e.mapConfig.delete.length>0){for(let t of e.objectConfig.delete){let e=t.split(".")[3],o=t.split(".")[2];a.deleteObjectConfig(e,o)}for(let t of e.mapConfig.delete){let e=t.split(".")[3],o=t.split(".")[2];a.deleteMapConfig(e,o)}}for(let a of h)e[a].upload.length>0&&r.push((()=>n.uploadDatabase(a)));return r.push((()=>n.uploadConfig("config"))),r.push((()=>n.uploadConfig("sync"))),r}))}static syncCover(e,a,t){return m(this,void 0,void 0,(function*(){let t=yield a.getLocalCoverList(),o=yield a.getCloudCoverList(),i=Array.from(new Set([...t,...o])),n=[];for(let r of i)t.includes(r)&&!o.includes(r)&&n.push((()=>a.uploadCover(r))),!t.includes(r)&&o.includes(r)&&"adrive"!==e.getItem("defaultSyncOption")&&n.push((()=>a.downloadCover(r)));return n}))}static syncBook(e,a){return m(this,void 0,void 0,(function*(){let t=yield a.getLocalBookList(),o=yield a.getCloudBookList(),i=[],n=Array.from(new Set([...t,...o]));for(let r of n){if(t.includes(r)&&!o.includes(r)){let e=r.split(".")[0],t=r.split(".")[1];i.push((()=>a.uploadBook(e,t)))}let n="yes"===e.getReaderConfig("autoOffline");if(!t.includes(r)&&o.includes(r)&&n&&"adrive"!==e.getItem("defaultSyncOption")){let e=r.split(".")[0],t=r.split(".")[1]||"epub";i.push((()=>a.offlineBook(e,t.toUpperCase())))}}return i}))}static runTasksWithLimit(e,a,t){return m(this,void 0,void 0,(function*(){if("ftp"!==t&&"adrive"!==t){const t=[],o=[];for(const i of e){const e=i().then((a=>(o.splice(o.indexOf(e),1),a)));t.push(e),o.push(e),o.length>=a&&(yield Promise.race(o))}return Promise.all(t)}for(let a of e)yield a()}))}}class ve{constructor(e,a){this.bookKey="",this.sessionStart=0,this.unregisterUnload=null,this.configService=e,this.platform=a}getDailySeconds(e,a){const t=((this.configService.getAllMapConfig("readingStats")||{})[a]||[]).find((a=>a.startsWith(e+"-")));if(!t)return 0;const o=t.split("-");return parseInt(o[o.length-1],10)||0}setDailySeconds(e,a,t){const o=(this.configService.getAllMapConfig("readingStats")||{})[a]||[],i=`${e}-${t}`,n=o.filter((a=>!a.startsWith(e+"-")));this.configService.setOneMapConfig(a,[...n,i],"readingStats")}start(e){this.bookKey=e,this.sessionStart=Date.now(),this.unregisterUnload=this.platform.registerUnloadHandler((()=>{var e,a;this.commit(),null===(a=(e=this.platform).onBeforeClose)||void 0===a||a.call(e)}))}stop(){var e;this.commit(),null===(e=this.unregisterUnload)||void 0===e||e.call(this),this.unregisterUnload=null,this.bookKey="",this.sessionStart=0}commit(){if(!this.bookKey||!this.sessionStart)return;const e=Date.now()-this.sessionStart;if(e<1e3)return void(this.sessionStart=0);const a=Math.round(e/1e3);this.sessionStart=0;const t=this.configService.getObjectConfig(this.bookKey,"readingTime",0);this.configService.setObjectConfig(this.bookKey,t+a,"readingTime");const o=function(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}(),i=this.getDailySeconds(this.bookKey,o);this.setDailySeconds(this.bookKey,o,i+a)}getTotalSeconds(e){return this.configService.getObjectConfig(e,"readingTime",0)}getDailySecondsForBook(e,a){return this.getDailySeconds(e,a)}getDayStats(e){return((this.configService.getAllMapConfig("readingStats")||{})[e]||[]).map((e=>{const a=e.lastIndexOf("-");return{bookKey:e.substring(0,a),seconds:parseInt(e.substring(a+1),10)||0}}))}getAllDates(){const e=this.configService.getAllMapConfig("readingStats");return Object.keys(e||{})}}const be="Koodo Reader",ke="application/vnd.koreader.v1+json";class Se extends Error{constructor(e,a,t,o){super(e),this.name="KOReaderRequestError",this.status=a,this.code=t,this.body=o}}const Ee=e=>{const a=(e||"").trim();if(!a)return"";return(/^https?:\/\//i.test(a)?a:`https://${a}`).replace(/\/+$/,"")},Ce=e=>{const a="number"==typeof e?e:parseFloat((e||"0")+"");return!isFinite(a)||isNaN(a)?0:a>1&&a<=100?Math.min(Math.max(a/100,0),1):Math.min(Math.max(a,0),1)},Te=(e,a={})=>m(void 0,void 0,void 0,(function*(){const t=yield fetch(e,a);return t.ok||(yield(e=>m(void 0,void 0,void 0,(function*(){let a=null;try{a=yield e.json()}catch(t){try{a=yield e.text()}catch(e){a=null}}const t=(null==a?void 0:a.message)||(null==a?void 0:a.error)||(null==a?void 0:a.msg)||("string"==typeof a?a:"")||e.statusText||"Request failed";throw console.error(`[KOReader] HTTP ${e.status} error: ${t}`,null!=a?a:"(no body)"),new Se(t,e.status,null==a?void 0:a.code,a)})))(t)),204===t.status?{}:yield t.json()})),we=e=>({Accept:ke,"Content-Type":"application/json","x-auth-user":e.username,"x-auth-key":e.passwordHash});class Ae{constructor(e,a,t){this.getKOReaderSyncConfig=()=>{let e;try{e=this.ConfigService.getObjectConfig("koReaderSyncConfig","thirdpartyToken",{})}catch(e){return console.error("[KOReader] Failed to read koReaderSyncConfig:",e),null}if(!e||"object"!=typeof e)return console.error("[KOReader] koReaderSyncConfig is missing or invalid"),null;const a=Ee(e.serverUrl||""),t=(e.username||"").trim(),o=(e.passwordHash||"").trim();return a&&t&&o?{serverUrl:a,username:t,passwordHash:o}:(console.error("[KOReader] Incomplete config — missing fields"),null)},this.getLocalRecordLocation=e=>this.ConfigService.getObjectConfig(e,"recordLocation",{})||{},this.persistKOReaderMetadata=(e,a,t)=>{const o=Object.assign(Object.assign({},a),{percentage:t.percentage.toString(),xpath:t.progress,timestamp:t.timestamp||parseInt(Date.now()/1e3+"")});this.ConfigService.setObjectConfig(e,o,"recordLocation")},this.authUser=e=>m(this,void 0,void 0,(function*(){return yield Te(`${e.serverUrl}/users/auth`,{method:"GET",headers:we(e)})})),this.createUser=e=>m(this,void 0,void 0,(function*(){return yield Te(`${e.serverUrl}/users/create`,{method:"POST",headers:{Accept:ke,"Content-Type":"application/json"},body:JSON.stringify({username:e.username,password:e.passwordHash})})})),this.getBookProgress=(e,a)=>m(this,void 0,void 0,(function*(){const t=yield Te(`${e.serverUrl}/syncs/progress/${encodeURIComponent(a)}`,{method:"GET",headers:we(e)});return t&&0!==Object.keys(t).length?{document:a,percentage:Ce(t.percentage),progress:t.progress||"",device:t.device||"",device_id:t.device_id||"",timestamp:t.timestamp||0}:null})),this.updateBookProgress=(e,a)=>m(this,void 0,void 0,(function*(){yield Te(`${e.serverUrl}/syncs/progress`,{method:"PUT",headers:we(e),body:JSON.stringify({document:a.document,percentage:a.percentage,progress:a.progress,device:a.device||be,device_id:a.device_id||"",timestamp:a.timestamp||parseInt(Date.now()/1e3+"")})})})),this.buildLocalUploadPayload=(e,a,t,o)=>m(this,void 0,void 0,(function*(){const i=Ce(a.percentage),n=a.xpath||"",r=this.ConfigService.getObjectConfig(e.key,"koreaderBooks",{});if(!r.document){let a=yield o(e);if(!a)return console.error(`[KOReader] Cannot build upload payload for "${e.name}": failed to compute partial MD5`),null;r.document=a,this.ConfigService.setObjectConfig(e.key,r,"koreaderBooks")}return n?{document:r.document,percentage:i,progress:n,device:be,device_id:t,timestamp:a.timestamp||parseInt(Date.now()/1e3+"")}:(console.error(`[KOReader] Cannot build upload payload for "${e.name}": no xpath/progress recorded (localRecord.xpath is empty)`),null)})),this.resolveDeviceId=()=>m(this,void 0,void 0,(function*(){try{return(yield this.TokenService.getFingerprint())||"koodo-reader"}catch(e){return console.error("[KOReader] Failed to get device fingerprint, using fallback ID:",e),"koodo-reader"}})),this.verifyAndBuildKOReaderSyncConfig=e=>m(this,void 0,void 0,(function*(){const a={serverUrl:Ee(e.serverUrl),username:(e.username||"").trim(),passwordHash:(e.password||"").trim()?s.MD5((e.password||"").trim()).toString():(e.passwordHash||"").trim()};if(!a.serverUrl||!a.username||!a.passwordHash)throw new Error("Please fill in all fields");try{return yield this.authUser(a),a}catch(e){console.error(`[KOReader] Auth failed for user "${a.username}" at ${a.serverUrl}, attempting to create user:`,e);try{return yield this.createUser(a),yield this.authUser(a),a}catch(o){if((t=o)instanceof Se&&(2002===t.code||(t.message||"").toLowerCase().includes("already exists")))throw console.error(`[KOReader] User "${a.username}" already exists but auth failed. Original auth error:`,e),e;throw console.error(`[KOReader] Failed to create user "${a.username}":`,o),o}}var t})),this.syncKOReaderProgress=e=>m(this,void 0,void 0,(function*(){const a=this.getKOReaderSyncConfig();if(!a)throw new Error("Please configure the KOReader sync server first");yield this.authUser(a);const t=yield this.resolveDeviceId(),o=(yield this.DatabaseService.getAllRecords("books"))||[],i={checkedBooks:0,matchedBooks:0,pulledBooks:0,pushedBooks:0,skippedBooks:0};for(const n of o)try{i.checkedBooks++;const o=this.getLocalRecordLocation(n.key);if(!o||!o.xpath){console.error(`[KOReader] Skipping "${n.name}": no local reading progress (xpath) found`),i.skippedBooks++;continue}const r=this.ConfigService.getObjectConfig(n.key,"koreaderBooks",{});if(!r.document){let a=yield e(n);if(!a){console.error(`[KOReader] Skipping "${n.name}": failed to compute partial MD5 for document ID`),i.skippedBooks++;continue}r.document=a,this.ConfigService.setObjectConfig(n.key,r,"koreaderBooks")}let l=r.document;const s=yield this.getBookProgress(a,l),d=(null==s?void 0:s.timestamp)||0,c=o.timestamp||0;if(s){if(i.matchedBooks++,d>c)this.persistKOReaderMetadata(n.key,o,s),i.pulledBooks++;else{if(!(d{if("number"!=typeof e){const[a,t]=e.split("-");return{styleType:a,color:t}}if(e>=0&&e-1,t=parseInt(xe[e].split("-")[1]);return{styleType:a?"background":"underline",color:a?Ie[t]:Fe[t]}}return{styleType:"background",color:"#FEF3CD"}},this.formatHighlightValue=e=>`${e.styleType}-${e.color}`,this.getNoteHighlightString=()=>this.ConfigService.getReaderConfig(Me)||"background-#FEF3CD",this.getNoteHighlightValue=()=>{const e=this.getNoteHighlightString();if(!e)return Ue;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveNoteHighlightValue=e=>{this.ConfigService.setReaderConfig(Me,`${e.styleType}-${e.color}`)},this.getTtsHighlightString=()=>this.ConfigService.getReaderConfig(_e)||Re,this.getTtsHighlightValue=()=>{const e=this.getTtsHighlightString();if(!e)return Oe;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveTtsHighlightValue=e=>{this.ConfigService.setReaderConfig(_e,`${e.styleType}-${e.color}`)},this.getSearchHighlightString=()=>this.ConfigService.getReaderConfig($e)||Re,this.getSearchHighlightValue=()=>{const e=this.ConfigService.getReaderConfig($e);if(!e)return Oe;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveSearchHighlightValue=e=>{this.ConfigService.setReaderConfig($e,`${e.styleType}-${e.color}`)},this.buildHighlightStyleForType=(e,a,t)=>{let o="background",i="#FEF3CD";if("number"==typeof e){if(e>=0&&e-1,t=parseInt(xe[e].split("-")[1]);o=a?"background":"underline",i=a?Ie[t]:Fe[t]}}else o=e.split("-")[0],i=e.split("-")[1];const n="background"===o?((e,a)=>{const t=e.replace("#",""),o=3===t.length?t.split("").map((e=>e+e)).join(""):t;return 6!==o.length?e:`rgba(${parseInt(o.slice(0,2),16)}, ${parseInt(o.slice(2,4),16)}, ${parseInt(o.slice(4,6),16)}, ${a})`})(i,.8):i;switch(o){case"background":return a?`background: ${n}; mix-blend-mode: multiply;`:`background: ${n};`;case"underline":return a?t?`border-right: 2px solid ${n};`:`border-bottom: 2px solid ${n};`:`text-decoration: underline; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return a?`background: linear-gradient(transparent calc(50% - 1px), ${n} calc(50% - 1px), ${n} calc(50% + 1px), transparent calc(50% + 1px));`:t?`background: linear-gradient(to right, transparent calc(50% - 1px), ${n} calc(50% - 1px), ${n} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const e=i.replace("#","%23");if(a){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${e}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(t){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${e}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${n};`}},this.buildHighlightPreviewStyle=(e,a)=>{switch(e){case"background":default:return{background:a};case"underline":return{textDecoration:"underline",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"};case"strikethrough":return{textDecoration:"line-through",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"};case"wavy":return{textDecorationLine:"underline",textDecorationStyle:"wavy",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"}}},this.convertNumberToHighlightValue=e=>this.getHighlightValue(e),this.buildTtsHighlightStyle=(e,a)=>this.buildHighlightStyleForType(this.getTtsHighlightString(),e,a),this.buildTtsHighlightPreviewStyle=(e,a)=>this.buildHighlightPreviewStyle(e,a),this.buildSearchHighlightStyle=(e,a)=>this.buildHighlightStyleForType(this.getSearchHighlightString(),e,a),this.buildSearchHighlightPreviewStyle=(e,a)=>this.buildHighlightPreviewStyle(e,a),this.ConfigService=e}}const ze=(De=class{static getItem(e){return localStorage.getItem(e)}static setItem(e,a){localStorage.setItem(e,a)}static removeItem(e){localStorage.removeItem(e)}},Le="browser",class extends De{static getReaderConfig(e){return w.includes(e)&&"undefined"!=typeof window&&window.currentBookKey&&this.getAllListConfig("seperateStyleBooks").includes(window.currentBookKey)?this.getObjectConfig(window.currentBookKey,"seperateStyleConfig",{})[e]:JSON.parse(this.getItem("readerConfig")||"{}")[e]}static setReaderConfig(e,a,t=!0){if(w.includes(e)&&"undefined"!=typeof window&&window.currentBookKey&&this.getAllListConfig("seperateStyleBooks").includes(window.currentBookKey)){let o=this.getObjectConfig(window.currentBookKey,"seperateStyleConfig",{});return o[e]=a,void this.setObjectConfig(window.currentBookKey,o,"seperateStyleConfig",t)}let o=JSON.parse(this.getItem("readerConfig")||"{}");o[e]=a,this.setItem("readerConfig",JSON.stringify(o)),t&&this.setSyncRecord({type:"config",catergory:"readerConfig",name:Le,key:e},{operation:"update",time:Date.now()})}static getAllListConfig(e){return("{}"!==this.getItem(e)&&this.getItem(e)?JSON.parse(this.getItem(e)||""):[])||[]}static deleteListConfig(e,a){let t=this.getAllListConfig(a);const o=t.indexOf(e);o>-1&&t.splice(o,1),this.setAllListConfig(t,a)}static setListConfig(e,a){let t=this.getAllListConfig(a);const o=t.indexOf(e);o>-1?(t.splice(o,1),t.unshift(e)):t.unshift(e),this.setAllListConfig(t,a)}static setAllListConfig(e,a,t=!0){this.setItem(a,JSON.stringify(e)),t&&this.setSyncRecord({type:"config",catergory:"listConfig",name:"general",key:a},{operation:"update",time:Date.now()})}static setObjectConfig(e,a,t,o=!0){let i=this.getAllObjectConfig(t);i[e]=a,o&&this.setSyncRecord({type:"config",catergory:"objectConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllObjectConfig(i,t)}static getObjectConfig(e,a,t){return this.getAllObjectConfig(a)[e]||t}static getAllObjectConfig(e){let a=this.getItem(e);return JSON.parse(a)||{}}static setAllObjectConfig(e,a){this.setItem(a,JSON.stringify(e))}static deleteObjectConfig(e,a){let t=this.getAllObjectConfig(a);delete t[e],this.setSyncRecord({type:"config",catergory:"objectConfig",name:a,key:e},{operation:"delete",time:Date.now()}),this.setAllObjectConfig(t,a)}static getAllMapConfig(e){let a=this.getItem(e);return JSON.parse(a)||{}}static getMapConfig(e,a){return this.getAllMapConfig(a)[e]||[]}static setAllMapConfig(e,a){this.setItem(a,JSON.stringify(e))}static setMapConfig(e,a,t){let o=this.getAllMapConfig(t);void 0===o[e]&&(o[e]=[]),a&&-1===o[e].indexOf(a)&&o[e].unshift(a),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,t)}static setOneMapConfig(e,a,t,o=!0){let i=this.getAllMapConfig(t);i[e]=a,o&&this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(i,t)}static deleteFromMapConfig(e,a,t){let o=this.getAllMapConfig(t),i=o[e].indexOf(a);o[e].splice(i,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,t)}static deleteFromAllMapConfig(e,a){let t=this.getAllMapConfig(a);Object.keys(t).forEach((o=>{let i=t[o].indexOf(e);i>-1&&(t[o].splice(i,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:a,key:o},{operation:"update",time:Date.now()}))})),this.setAllMapConfig(t,a)}static deleteMapConfig(e,a){let t=this.getAllMapConfig(a);delete t[e],this.setSyncRecord({type:"config",catergory:"mapConfig",name:a,key:e},{operation:"delete",time:Date.now()}),this.setAllMapConfig(t,a)}static getFromAllMapConfig(e,a){let t=this.getAllMapConfig(a),o=[];for(let a in t)t[a]&&t[a].indexOf(e)>-1&&o.push(a);return o}static getSyncRecord(e){return JSON.parse(this.getItem("syncRecord")||"{}")[e.type+"."+e.catergory+"."+e.name+"."+e.key]||{operation:"",time:0}}static getAllSyncRecord(){return JSON.parse(this.getItem("syncRecord")||"{}")}static setSyncRecord(e,a){const t=e.type+"."+e.catergory+"."+e.name+"."+e.key;let o=JSON.parse(this.getItem("syncRecord")||"{}");o[t]=a,this.setItem("syncRecord",JSON.stringify(o))}static setAllSyncRecord(e){this.setItem("syncRecord",JSON.stringify(e))}});var De,Le;class Pe{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("notionSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Notion] notionSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Notion] Failed to read notionSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableNotionSync")}resolveDatabaseId(e,a){return m(this,void 0,void 0,(function*(){const t=yield fetch(`https://api.notion.com/v1/blocks/${a}/children`,{method:"GET",headers:{Authorization:`Bearer ${e}`,"Notion-Version":"2022-06-28"}});if(!t.ok){const e=yield t.json().catch((()=>null));throw console.error(`[Notion] resolveDatabaseId failed for page ${a}: HTTP ${t.status} ${t.statusText}`,JSON.stringify(e)),new Error(`Notion resolve database error: ${t.status} ${t.statusText}`)}const o=yield t.json(),i=(o.results||[]).find((e=>"child_database"===e.type));if(!i)throw console.error(`[Notion] No child_database block found under page ${a}. Available block types:`,JSON.stringify((o.results||[]).map((e=>e.type)))),new Error(`No child database found in page ${a}. Please provide a Database ID directly.`);return i.id}))}findOrCreatePage(e,a,t){return m(this,void 0,void 0,(function*(){const o=`${t}`,i=yield fetch(`https://api.notion.com/v1/databases/${a}/query`,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({filter:{property:"title",title:{equals:o}}})});if(!i.ok){const o=yield i.json().catch((()=>({})));if(400===i.status&&"validation_error"===(null==o?void 0:o.code)&&"string"==typeof(null==o?void 0:o.message)&&o.message.includes("is a page, not a database")){console.error(`[Notion] Provided databaseId "${a}" is a page, not a database. Resolving child database...`);const o=yield this.resolveDatabaseId(e,a);return this.findOrCreatePage(e,o,t)}throw console.error(`[Notion] Database query failed for databaseId "${a}" (book: "${t}"): HTTP ${i.status} ${i.statusText}`,JSON.stringify(o)),new Error(`Notion API error: ${i.status} ${i.statusText}`)}const n=yield i.json();if(n.results&&n.results.length>0)return n.results[0].id;const r=yield fetch("https://api.notion.com/v1/pages",{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({parent:{database_id:a},properties:{title:{title:[{text:{content:o}}]}}})});if(!r.ok){const e=yield r.json().catch((()=>null));throw console.error(`[Notion] Failed to create page for book "${t}" in database "${a}": HTTP ${r.status} ${r.statusText}`,JSON.stringify(e)),new Error(`Notion create page error: ${r.status} ${r.statusText}`)}return(yield r.json()).id}))}appendBlocks(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=!t.notes||0===t.notes.length,n=[];n.push({object:"block",type:"divider",divider:{}}),o&&n.push({object:"block",type:"heading_3",heading_3:{rich_text:[{type:"text",text:{content:o}}]}}),n.push({object:"block",type:"quote",quote:{rich_text:[{type:"text",text:{content:t.text||""}}]}}),!i&&t.notes&&n.push({object:"block",type:"paragraph",paragraph:{rich_text:[{type:"text",text:{content:`📝 ${t.notes}`}}]}});const r=`${t.date.year}-${String(t.date.month).padStart(2,"0")}-${String(t.date.day).padStart(2,"0")}`;n.push({object:"block",type:"paragraph",paragraph:{rich_text:[{type:"text",text:{content:`Added on ${r}`},annotations:{italic:!0,color:"gray"}}]}});const l=yield fetch(`https://api.notion.com/v1/blocks/${a}/children`,{method:"PATCH",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({children:n})});if(!l.ok){const e=yield l.json().catch((()=>null));throw console.error(`[Notion] Failed to append blocks to page ${a}: HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),new Error(`Notion append blocks error: ${l.status} ${l.statusText}`)}}))}syncNote(e,a){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const t=this.getConfig();if(!t)return!1;try{const o=yield this.findOrCreatePage(t.token,t.databaseId,a);return yield this.appendBlocks(t.token,o,e,e.chapter||""),!0}catch(e){return console.error(`[Notion] Sync failed for book "${a}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class je{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("yuqueSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Yuque] yuqueSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Yuque] Failed to read yuqueSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableYuqueSync")}generateDocSlug(e){return m(this,void 0,void 0,(function*(){const a=(e||"").trim()||"untitled",t=a.toLowerCase().replace(/[^a-z0-9_.-]/g,"-").replace(/[-_.]{2,}/g,"-").replace(/^[-_.]+|[-_.]+$/g,"")||"book",o=(yield y(a)).slice(0,16),i=t,n=190-o.length-1;return`${i.substring(0,n).replace(/^[-_.]+|[-_.]+$/g,"")||"book"}-${o}`}))}findOrCreateDoc(e,a,t){return m(this,void 0,void 0,(function*(){const o=`${t}`,i=yield this.generateDocSlug(t);try{const t=yield fetch(`${je.API_BASE}/repos/${a}/docs/${i}`,{method:"GET",headers:{"X-Auth-Token":e,"Content-Type":"application/json"}});if(t.ok){const e=yield t.json();return{id:e.data.id,slug:e.data.slug,body:e.data.body||""}}if(404!==t.status){const e=yield t.json().catch((()=>null));console.error(`[Yuque] Unexpected error fetching doc "${i}" in repo "${a}": HTTP ${t.status} ${t.statusText}`,JSON.stringify(e))}}catch(e){console.error(`[Yuque] Network error fetching doc "${i}" in repo "${a}":`,JSON.stringify(e))}const n=yield fetch(`${je.API_BASE}/repos/${a}/docs`,{method:"POST",headers:{"X-Auth-Token":e,"Content-Type":"application/json"},body:JSON.stringify({title:o,slug:i,body:`# ${o}\n\n`,format:"markdown"})});if(!n.ok){const e=yield n.json().catch((()=>null));throw console.error(`[Yuque] Failed to create doc "${o}" in repo "${a}": HTTP ${n.status} ${n.statusText}`,JSON.stringify(e)),new Error(`Yuque create doc error: ${n.status} ${n.statusText}`)}const r=yield n.json();return{id:r.data.id,slug:r.data.slug,body:r.data.body||""}}))}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="\n---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}updateDoc(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${je.API_BASE}/repos/${a}/docs/${t}`,{method:"PUT",headers:{"X-Auth-Token":e,"Content-Type":"application/json"},body:JSON.stringify({body:o,format:"markdown"})});if(!i.ok){const e=yield i.json().catch((()=>null));throw console.error(`[Yuque] Failed to update doc ${t} in repo "${a}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),new Error(`Yuque update doc error: ${i.status} ${i.statusText}`)}}))}syncNote(e,a){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const t=this.getConfig();if(!t)return!1;try{const o=yield this.findOrCreateDoc(t.token,t.namespace,a),i=this.formatNoteMarkdown(e),n=o.body+i;return yield this.updateDoc(t.token,t.namespace,o.id,n),!0}catch(e){return console.error(`[Yuque] Sync failed for book "${a}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}je.API_BASE="https://www.yuque.com/api/v2";class Ke{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("readwiseSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Readwise] readwiseSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Readwise] Failed to read readwiseSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableReadwiseSync")}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=`${a}`,n=!e.notes||0===e.notes.length,r={text:e.text||"",title:i,author:t||"Unknown",source_type:"koodo-reader",category:"books",highlighted_at:`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`};if(!n&&e.notes&&(r.note=e.notes),e.chapter){const a=parseInt(e.chapter,10);isNaN(a)||(r.location_type="order",r.location=a)}try{const e=yield fetch(`${Ke.API_BASE}/highlights/`,{method:"POST",headers:{Authorization:`Token ${o.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({highlights:[r]})});if(!e.ok){const a=yield e.json().catch((()=>null));throw console.error(`[Readwise] Failed to sync highlight for book "${i}": HTTP ${e.status} ${e.statusText}`,JSON.stringify(a)),new Error(`Readwise API error: ${e.status} ${e.statusText}`)}return!0}catch(a){return console.error(`[Readwise] Sync failed for book "${i}" (text: "${(e.text||"").substring(0,50)}..."):`,JSON.stringify(a instanceof Error?a.message:a)),!1}}))}}Ke.API_BASE="https://readwise.io/api/v2";class He{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("imaSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[IMA] imaSyncConfig is empty or not set"),null):e}catch(e){return console.error("[IMA] Failed to read imaSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableImaSync")}getHeaders(e){return{"Content-Type":"application/json","ima-openapi-clientid":e.clientId,"ima-openapi-apikey":e.apiKey}}formatNoteMarkdown(e,a,t){const o=!e.notes||0===e.notes.length,i=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let n="\n---\n\n";return e.chapter&&(n+=`### ${e.chapter}\n\n`),n+=`> ${e.text||""}\n\n`,!o&&e.notes&&(n+=`**Note:** ${e.notes}\n\n`),n+=`*${i}*\n`,n}findNoteByTitle(e,a){var t,o,i,n;return m(this,void 0,void 0,(function*(){try{const r=JSON.stringify({search_type:0,query_info:{title:a},start:0,end:20}),l=yield fetch(`${He.API_BASE}/search_note`,{method:"POST",headers:this.getHeaders(e),body:r});if(!l.ok){const e=yield l.json().catch((()=>null));return console.error(`[IMA] search_note failed for title "${a}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),null}const s=yield l.json();if(0!==s.code)return console.error(`[IMA] search_note returned error code ${s.code} for title "${a}":`,JSON.stringify(null!==(t=s.msg)&&void 0!==t?t:s)),null;const d=((null===(o=s.data)||void 0===o?void 0:o.search_note_infos)||[]).find((e=>{var t;return a.includes(null===(t=e.note_book_info)||void 0===t?void 0:t.title.replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu,""))}));return null!==(n=null===(i=null==d?void 0:d.note_book_info)||void 0===i?void 0:i.note_id)&&void 0!==n?n:null}catch(e){return console.error(`[IMA] Network error in search_note for title "${a}":`,JSON.stringify(e)),null}}))}createNote(e,a,t){var o,i,n;return m(this,void 0,void 0,(function*(){try{const r={content_format:1,content:`# ${a}\n\n${t}`};e.folderId&&(r.folder_id=e.folderId);const l=yield fetch(`${He.API_BASE}/import_doc`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify(r)});if(!l.ok){const e=yield l.json().catch((()=>null));return console.error(`[IMA] import_doc failed for note "${a}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),null}const s=yield l.json();return 0!==s.code?(console.error(`[IMA] import_doc returned error code ${s.code} for note "${a}":`,JSON.stringify(null!==(o=s.msg)&&void 0!==o?o:s)),null):null!==(n=null===(i=s.data)||void 0===i?void 0:i.note_id)&&void 0!==n?n:null}catch(e){return console.error(`[IMA] Network error in import_doc for note "${a}":`,JSON.stringify(e)),null}}))}appendNote(e,a,t){var o;return m(this,void 0,void 0,(function*(){try{const i=yield fetch(`${He.API_BASE}/append_doc`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify({note_id:a,content_format:1,content:t})});if(!i.ok){const e=yield i.json().catch((()=>null));return console.error(`[IMA] append_doc failed for noteId "${a}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),!1}const n=yield i.json();return 0===n.code||(console.error(`[IMA] append_doc returned error code ${n.code} for noteId "${a}":`,JSON.stringify(null!==(o=n.msg)&&void 0!==o?o:n)),!1)}catch(e){return console.error(`[IMA] Network error in append_doc for noteId "${a}":`,JSON.stringify(e)),!1}}))}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=this.formatNoteMarkdown(e,a,t);let n=yield this.findNoteByTitle(o,a);if(n){const e=yield this.appendNote(o,n,i);return e||console.error(`[IMA] Failed to append to existing note "${a}" (noteId: ${n})`),e}return n=yield this.createNote(o,a,i),n||console.error(`[IMA] Failed to create note for book "${a}"`),null!==n}))}}He.API_BASE="https://ima.qq.com/openapi/note/v1";class Je{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("siyuanSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[SiYuan] siyuanSyncConfig is empty or not set"),null):e}catch(e){return console.error("[SiYuan] Failed to read siyuanSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableSiYuanSync")}getHeaders(e){return{"Content-Type":"application/json",Authorization:`Token ${e}`}}findOrCreateNotebook(e,a){var t,o;return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/notebook/lsNotebooks`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({})});if(!i.ok){const a=yield i.json().catch((()=>null));throw console.error(`[SiYuan] lsNotebooks failed at ${e}: HTTP ${i.status} ${i.statusText}`,JSON.stringify(a)),new Error(`SiYuan list notebooks failed: ${i.status} ${i.statusText}`)}const n=yield i.json();if(0!==n.code)throw console.error(`[SiYuan] lsNotebooks returned error code ${n.code}:`,JSON.stringify(n.msg)),new Error(`SiYuan list notebooks error: ${n.msg}`);const r=(null!==(o=null===(t=n.data)||void 0===t?void 0:t.notebooks)&&void 0!==o?o:[]).find((e=>"Koodo Reader"===e.name));if(r)return r.id;const l=yield fetch(`${e}/api/notebook/createNotebook`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({name:"Koodo Reader"})});if(!l.ok){const a=yield l.json().catch((()=>null));throw console.error(`[SiYuan] createNotebook failed at ${e}: HTTP ${l.status} ${l.statusText}`,JSON.stringify(a)),new Error(`SiYuan create notebook failed: ${l.status} ${l.statusText}`)}const s=yield l.json();if(0!==s.code)throw console.error(`[SiYuan] createNotebook returned error code ${s.code}:`,JSON.stringify(s.msg)),new Error(`SiYuan create notebook error: ${s.msg}`);return s.data.notebook.id}))}findOrCreateDoc(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/query/sql`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({stmt:`SELECT id FROM blocks WHERE type='d' AND hpath='${o.replace(/'/g,"''")}' LIMIT 1`})});if(i.ok){const e=yield i.json();if(0!==e.code)console.error(`[SiYuan] SQL query for doc "${o}" returned error code ${e.code}:`,JSON.stringify(e.msg));else if(e.data&&e.data.length>0)return e.data[0].id}else{const e=yield i.json().catch((()=>null));console.error(`[SiYuan] SQL query for doc "${o}" failed: HTTP ${i.status} ${i.statusText}`,JSON.stringify(e))}const r=n?`**Author:** ${n}\n`:"",l=yield fetch(`${e}/api/filetree/createDocWithMd`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({notebook:t,path:o,markdown:r})});if(!l.ok){const e=yield l.json().catch((()=>null));throw console.error(`[SiYuan] createDocWithMd failed for "${o}" in notebook "${t}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),new Error(`SiYuan create doc failed: ${l.status} ${l.statusText}`)}const s=yield l.json();if(0!==s.code)throw console.error(`[SiYuan] createDocWithMd returned error code ${s.code} for "${o}":`,JSON.stringify(s.msg)),new Error(`SiYuan create doc error: ${s.msg}`);return s.data}))}appendMarkdownToDoc(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/block/appendBlock`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({data:o,dataType:"markdown",parentID:t})});if(!i.ok){const e=yield i.json().catch((()=>null));throw console.error(`[SiYuan] appendBlock failed for docId "${t}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),new Error(`SiYuan append block failed: ${i.status} ${i.statusText}`)}const n=yield i.json();if(0!==n.code)throw console.error(`[SiYuan] appendBlock returned error code ${n.code} for docId "${t}":`,JSON.stringify(n.msg)),new Error(`SiYuan append block error: ${n.msg}`)}))}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}sanitizePathComponent(e){return e.replace(/[\\/:*?"<>|]/g,"_").trim()}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const{serverUrl:i,token:n}=o;if(!i||!n)return console.error("[SiYuan] Sync skipped: config is missing serverUrl or token",JSON.stringify({hasServerUrl:!!i,hasToken:!!n})),!1;try{const o=yield this.findOrCreateNotebook(i,n),r=`/${this.sanitizePathComponent(a)}`,l=yield this.findOrCreateDoc(i,n,o,r,a,t),s=this.formatNoteMarkdown(e);return yield this.appendMarkdownToDoc(i,n,l,s),!0}catch(e){return console.error(`[SiYuan] Sync failed for book "${a}" at ${o.serverUrl}:`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class We{constructor(e,a){this.databaseService=e,this.notionSync=new Pe(a),this.yuqueSync=new je(a),this.readwiseSync=new Ke(a),this.imaSync=new He(a),this.siyuanSync=new Je(a)}getExtraServices(){return[]}getEnabledServices(){const e=[];return this.notionSync.isEnabled()&&e.push({name:"Notion",sync:this.notionSync.syncNote.bind(this.notionSync)}),this.yuqueSync.isEnabled()&&e.push({name:"Yuque",sync:this.yuqueSync.syncNote.bind(this.yuqueSync)}),this.readwiseSync.isEnabled()&&e.push({name:"Readwise",sync:this.readwiseSync.syncNote.bind(this.readwiseSync)}),this.imaSync.isEnabled()&&e.push({name:"IMA",sync:this.imaSync.syncNote.bind(this.imaSync)}),this.siyuanSync.isEnabled()&&e.push({name:"SiYuan",sync:this.siyuanSync.syncNote.bind(this.siyuanSync)}),[...e,...this.getExtraServices()]}syncNote(e,a){return m(this,void 0,void 0,(function*(){const t=this.getEnabledServices();if(0===t.length)return;let o="Unknown Book",i="";if(a||e.bookKey)try{const t=yield this.databaseService.getRecord(a||e.bookKey,"books");t&&t.name&&(o=t.name),t&&t.author&&(i=t.author)}catch(t){console.error(`[NoteSync] Failed to resolve book info for key: ${a||e.bookKey}`,JSON.stringify(t))}const n=(yield Promise.allSettled(t.map((a=>m(this,void 0,void 0,(function*(){var t,n,r,l;try{const r=yield a.sync(e,o,i);return r||console.error(`[NoteSync] ${a.name} sync returned false for book "${o}" (noteId: ${null!==(n=null!==(t=e.noteKey)&&void 0!==t?t:e.key)&&void 0!==n?n:"unknown"})`),{name:a.name,success:r}}catch(t){return console.error(`[NoteSync] ${a.name} sync threw an error for book "${o}" (noteId: ${null!==(l=null!==(r=e.noteKey)&&void 0!==r?r:e.key)&&void 0!==l?l:"unknown"}):`,JSON.stringify(t)),{name:a.name,success:!1}}})))))).filter((e=>"rejected"===e.status||"fulfilled"===e.status&&!e.value.success)).map((e=>"fulfilled"===e.status?e.value.name:"Unknown"));n.length>0&&console.error(`[NoteSync] Sync failed for services: ${n.join(", ")} | book: "${o}"`)}))}}class qe{constructor(e,a,t){this.configService=e,this.fs=a,this.path=t}getConfig(){try{const e=this.configService.getObjectConfig("markdownSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Markdown] markdownSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Markdown] Failed to read markdownSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableMarkdownSync")}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="\n---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}sanitizeFileName(e){return e.replace(/[\\/:*?"<>|]/g,"_").trim()}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=o.folder;if(!i)return console.error("[Markdown] Sync skipped: markdownSyncConfig.folder is not set"),!1;const n=this.fs,r=this.path;try{const o=this.sanitizeFileName(a),l=r.join(i,`${o}.md`);if(!n.existsSync(l)){const e=`# ${a}\n`,o=t?`**Author:** ${t}\n\n`:"\n";try{n.writeFileSync(l,e+o,"utf-8")}catch(e){return console.error(`[Markdown] Failed to create file "${l}" for book "${a}":`,JSON.stringify(e)),!1}}const s=this.formatNoteMarkdown(e);try{n.appendFileSync(l,s,"utf-8")}catch(e){return console.error(`[Markdown] Failed to append to file "${l}" for book "${a}":`,JSON.stringify(e)),!1}return!0}catch(e){return console.error(`[Markdown] Sync failed for book "${a}" in folder "${i}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class Ge extends We{constructor(e,a,t,o){super(e,a),this.markdownSync=new qe(a,t,o)}getExtraServices(){return this.markdownSync.isEnabled()?[{name:"Markdown",sync:this.markdownSync.syncNote.bind(this.markdownSync)}]:[]}}class Qe{constructor(a){this.syncWordToEudic=(a,t)=>m(this,void 0,void 0,(function*(){var o,i,n,r,l,s,d,c,u,m;if("yes"===this.configService.getReaderConfig("isEnableEudicSync"))try{let c;try{c=this.configService.getObjectConfig("eudicSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[Eudic] Failed to read eudicSyncConfig:",JSON.stringify(e))}if(!c||!c.accessToken)return void console.error("[Eudic] Sync skipped: config is missing or accessToken is not set",JSON.stringify({hasConfig:!!c}));const u=c.language||"en",m={Authorization:`NIS ${c.accessToken}`,"Content-Type":"application/json","User-Agent":"Mozilla/5.0"};let p="0";const h=(c.categoryName||"").trim();if(h)if(void 0!==c.categoryId)p=c.categoryId;else try{const a=(null===(o=(yield e.get(`https://api.frdic.com/api/open/v1/studylist/category?language=${u}`,{headers:m})).data)||void 0===o?void 0:o.data)||[],t=a.find((e=>e.name===h));t?p=t.id:console.error(`[Eudic] Category "${h}" not found among available categories:`,JSON.stringify(a.map((e=>e.name))));const i=Object.assign(Object.assign({},c),{categoryId:p});this.configService.setObjectConfig("eudicSyncConfig",i,"thirdpartyToken")}catch(e){console.error("[Eudic] Failed to fetch category list:",null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.status,JSON.stringify(null!==(r=null===(n=null==e?void 0:e.response)||void 0===n?void 0:n.data)&&void 0!==r?r:e))}try{yield e.post("https://api.frdic.com/api/open/v1/studylist/word",{language:u,word:a,context_line:t||"",category_ids:[p]},{headers:m})}catch(e){throw console.error(`[Eudic] Failed to add word "${a}" to study list (category: ${p}):`,null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,JSON.stringify(null!==(d=null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.data)&&void 0!==d?d:e)),e}}catch(e){console.error("[Eudic] Sync error for word:",a,null===(c=null==e?void 0:e.response)||void 0===c?void 0:c.status,JSON.stringify(null!==(m=null===(u=null==e?void 0:e.response)||void 0===u?void 0:u.data)&&void 0!==m?m:e))}})),this.syncWordToAnki=(a,t,o,i,n="")=>m(this,void 0,void 0,(function*(){var r,l,s,d,c,u,m,p,h,g;if("yes"===this.configService.getReaderConfig("isEnableAnkiSync"))try{let h;try{h=this.configService.getObjectConfig("ankiSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[Anki] Failed to read ankiSyncConfig:",JSON.stringify(e))}if(!h||!h.deckName)return void console.error("[Anki] Sync skipped: config is missing or deckName is not set",JSON.stringify({hasConfig:!!h}));const g=h.host||"127.0.0.1",f=`http://${g}:${h.port||"8765"}`,y=h.deckName,N="Koodo Reader Word",v=(a,t={})=>{const o={action:a,version:6,params:t};return h.apiKey&&(o.key=h.apiKey),e.post(f,o)};if(!h.modelName)try{const e=yield v("modelNames");if(!((null===(r=e.data)||void 0===r?void 0:r.result)||[]).includes(N))try{yield v("createModel",{modelName:N,inOrderFields:["Word","Sentence","Book","Chapter","Definition"],cardTemplates:[{Name:"Card 1",Front:"{{Word}}

{{Sentence}}

{{Book}}
{{Chapter}}",Back:"{{Definition}}"}]})}catch(e){throw console.error(`[Anki] Failed to create model "${N}":`,JSON.stringify(null!==(s=null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.data)&&void 0!==s?s:e)),e}this.configService.setObjectConfig("ankiSyncConfig",Object.assign(Object.assign({},h),{modelName:N}),"thirdpartyToken")}catch(e){throw console.error(`[Anki] Failed to fetch model names from ${f}:`,JSON.stringify(null!==(c=null===(d=null==e?void 0:e.response)||void 0===d?void 0:d.data)&&void 0!==c?c:e)),e}try{const e=yield v("addNote",{note:{deckName:y,modelName:N,fields:{Word:a,Sentence:t||"",Book:o||"",Chapter:i||"",Definition:n||""},options:{allowDuplicate:!1},tags:[]}});(null===(u=e.data)||void 0===u?void 0:u.error)&&console.error(`[Anki] addNote returned an error for word "${a}" in deck "${y}":`,JSON.stringify(e.data.error))}catch(e){throw console.error(`[Anki] Failed to add note for word "${a}" to deck "${y}" at ${f}:`,JSON.stringify(null!==(p=null===(m=null==e?void 0:e.response)||void 0===m?void 0:m.data)&&void 0!==p?p:e)),e}}catch(e){console.error("[Anki] Sync error for word:",a,JSON.stringify(null!==(g=null===(h=null==e?void 0:e.response)||void 0===h?void 0:h.data)&&void 0!==g?g:e))}})),this.syncWordToMaiMemo=a=>m(this,void 0,void 0,(function*(){var t,o,i,n,r,l,s,d,c,u,m,p,h,g,f,y,N,v,b,k;if("yes"===this.configService.getReaderConfig("isEnableMaiMemoSync"))try{let v;try{v=this.configService.getObjectConfig("maimemoSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[MaiMemo] Failed to read maimemoSyncConfig:",JSON.stringify(e))}if(!v||!v.accessToken||!v.notepadName)return void console.error("[MaiMemo] Sync skipped: config is missing accessToken or notepadName",JSON.stringify({hasConfig:!!v}));const b=v.accessToken,k=v.notepadName.trim(),S={Authorization:`Bearer ${b}`,"Content-Type":"application/json",Accept:"application/json"};let E=v.notepadId||"";if(!E)try{const l=yield e.get("https://open.maimemo.com/open/api/v1/memo/notepads",{headers:S}),s=((null===(o=null===(t=l.data)||void 0===t?void 0:t.data)||void 0===o?void 0:o.notepads)||[]).find((e=>"PUBLISHED"===e.status&&e.title===k));if(s)E=s.id;else{if(E=null===(r=null===(n=null===(i=(yield e.post("https://open.maimemo.com/open/api/v1/memo/notepads",{notepad:{status:"PUBLISHED",content:a,title:k,brief:k,tags:[]}},{headers:S})).data)||void 0===i?void 0:i.data)||void 0===n?void 0:n.notepad)||void 0===r?void 0:r.id,!E)return void console.error("[MaiMemo] Created notepad but no id returned")}this.configService.setObjectConfig("maimemoSyncConfig",Object.assign(Object.assign({},v),{notepadId:E}),"thirdpartyToken")}catch(e){return void console.error("[MaiMemo] Failed to resolve notepadId:",null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,JSON.stringify(null!==(d=null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.data)&&void 0!==d?d:e))}try{let t="";try{t=(null===(m=null===(u=null===(c=(yield e.get(`https://open.maimemo.com/open/api/v1/memo/notepads/${E}`,{headers:S})).data)||void 0===c?void 0:c.data)||void 0===u?void 0:u.notepad)||void 0===m?void 0:m.content)||""}catch(e){return void console.error("[MaiMemo] Failed to fetch notepad content:",null===(p=null==e?void 0:e.response)||void 0===p?void 0:p.status,JSON.stringify(null!==(g=null===(h=null==e?void 0:e.response)||void 0===h?void 0:h.data)&&void 0!==g?g:e))}const o=t.split("\n").map((e=>e.trim())).filter((e=>e.length>0));if(o.includes(a))return;o.push(a),yield e.post(`https://open.maimemo.com/open/api/v1/memo/notepads/${E}`,{id:E,notepad:{status:"PUBLISHED",content:o.join("\n"),title:k,brief:k,tags:[]}},{headers:S})}catch(e){throw console.error(`[MaiMemo] Failed to add word "${a}" to notepad "${k}" (${E}):`,null===(f=null==e?void 0:e.response)||void 0===f?void 0:f.status,JSON.stringify(null!==(N=null===(y=null==e?void 0:e.response)||void 0===y?void 0:y.data)&&void 0!==N?N:e)),e}}catch(e){console.error("[MaiMemo] Sync error for word:",a,null===(v=null==e?void 0:e.response)||void 0===v?void 0:v.status,JSON.stringify(null!==(k=null===(b=null==e?void 0:e.response)||void 0===b?void 0:b.data)&&void 0!==k?k:e))}})),this.configService=a}}class Ye extends Qe{}export{S as CommonTool,ze as ConfigService,Be as HighlightUtil,Ae as KOReaderUtil,A as KookitConfig,ye as LoginHelper,Ge as NoteSyncManager,he as ReaderRequest,ve as ReadingTimeUtil,ce as SqlStatement,Ne as SyncHelper,oe as SyncUtil,ge as ThirdpartyRequest,fe as UserRequest,Ye as WordSyncManager}; +import e from"axios";import{Storage as a}from"megajs";import{Buffer as t}from"buffer";import{S3Client as o,ListObjectsV2Command as i,DeleteObjectCommand as n,PutObjectCommand as r,GetObjectCommand as l}from"@aws-sdk/client-s3";import s from"crypto-js";import{AuthType as d,createClient as c}from"webdav/dist/web/index.js";import{SSE as u}from"sse.js";function m(e,a,t,o){return new(t||(t=Promise))((function(i,n){function r(e){try{s(o.next(e))}catch(e){n(e)}}function l(e){try{s(o.throw(e))}catch(e){n(e)}}function s(e){var a;e.done?i(e.value):(a=e.value,a instanceof t?a:new t((function(e){e(a)}))).then(r,l)}s((o=o.apply(e,a||[])).next())}))}const p=e=>"json"===e?"application/json":["jpg","jpeg","png","gif","bmp"].includes(e)?"image/"+e:"zip"===e?"application/zip":"epub"===e?"application/epub+zip":"txt"===e?"text/plain":"pdf"===e?"application/pdf":"mobi"===e?"application/x-mobipocket-ebook":"azw3"===e||"azw"===e?"application/vnd.amazon.ebook":"cbz"===e?"application/x-cbz":"cbr"===e?"application/x-cbr":"cbt"===e?"application/x-cbt":"cb7"===e?"application/x-cb7":"fb2"===e?"application/x-fictionbook+xml":"html"===e?"text/html":"css"===e?"text/css":"js"===e?"application/javascript":"xml"===e?"application/xml":"xhtml"===e?"application/xhtml+xml":"opf"===e?"application/oebps-package+xml":"ncx"===e?"application/x-dtbncx+xml":"mp3"===e?"audio/mpeg":"wav"===e?"audio/wav":"ogg"===e?"audio/ogg":"mp4"===e?"video/mp4":"webm"===e?"video/webm":"avi"===e?"video/x-msvideo":"wmv"===e?"video/x-ms-wmv":"flv"===e?"video/x-flv":"m3u8"===e?"application/x-mpegURL":"ts"===e?"video/MP2T":"3gp"===e?"video/3gpp":"3g2"===e?"video/3gpp2":"db"===e?"application/x-sqlite3":void 0,h=["books","notes","bookmarks","plugins","words"],g=e=>{const a=atob(e),t=a.length,o=new Uint8Array(t);for(let e=0;e{let a="";const t=new Uint8Array(e),o=t.byteLength;for(let e=0;ee.toString(16).padStart(2,"0"))).join("")}))}function N(e){const a=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],t=(e,a)=>e>>>a|e<<32-a,o=(e,a,t)=>e&a^~e&t,i=(e,a,t)=>e&a^e&t^a&t,n=e=>t(e,2)^t(e,13)^t(e,22),r=e=>t(e,6)^t(e,11)^t(e,25),l=e=>t(e,7)^t(e,18)^e>>>3,s=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],d=8*e.length,c=(960-(8*e.length+1)%512)%512,u=e.length+Math.ceil((c+1)/8)+8,m=new Uint8Array(u);m.set(e),m[e.length]=128;new DataView(m.buffer,m.byteLength-8).setBigUint64(0,BigInt(d),!1);for(let e=0;e>>10)+c[e-7]+l(c[e-15])+c[e-16]>>>0);let[u,h,g,f,y,N,v,b]=s;for(let e=0;e<64;e++){const t=b+r(y)+o(y,N,v)+a[e]+c[e]>>>0,l=n(u)+i(u,h,g)>>>0;b=v,v=N,N=y,y=f+t>>>0,f=g,g=h,h=u,u=t+l>>>0}s[0]=s[0]+u>>>0,s[1]=s[1]+h>>>0,s[2]=s[2]+g>>>0,s[3]=s[3]+f>>>0,s[4]=s[4]+y>>>0,s[5]=s[5]+N>>>0,s[6]=s[6]+v>>>0,s[7]=s[7]+b>>>0}var p;const h=new ArrayBuffer(32),g=new DataView(h);return s.forEach(((e,a)=>{g.setUint32(4*a,e,!1)})),h}const v={_chars:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",encode(e){if("string"!=typeof e)throw new Error("Input must be a string");let a="",t=0;const o=this._stringToUtf8Bytes(e),i=o.length;for(;t>2,s=(3&e)<<4|n>>4,d=(15&n)<<2|r>>6,c=63&r;a+=this._chars.charAt(l),a+=this._chars.charAt(s),a+=t-2>=i?"=":this._chars.charAt(d),a+=t-1>=i?"=":this._chars.charAt(c)}return a},decode(e){if("string"!=typeof e)throw new Error("Input must be a string");for(e=e.replace(/[^A-Za-z0-9+/]/g,"");e.length%4!=0;)e+="=";const a=[];let t=0;const o=e.length;for(;t>4,s=(15&i)<<4|n>>2,d=(3&n)<<6|r;a.push(l),-1!==n&&a.push(s),-1!==r&&a.push(d)}return this._utf8BytesToString(a)},_stringToUtf8Bytes(e){const a=[];for(let t=0;t>6),a.push(128|63&o);else if(55296==(64512&o)&&t+1>18),a.push(128|e>>12&63),a.push(128|e>>6&63),a.push(128|63&e)}else a.push(239,191,189),t--}else a.push(224|o>>12),a.push(128|o>>6&63),a.push(128|63&o)}return a},_utf8BytesToString(e){let a="",t=0;for(;t65535){const t=e-65536;a+=String.fromCharCode(55296|t>>10),a+=String.fromCharCode(56320|1023&t)}else a+=String.fromCharCode(e)}else a+="�"}else a+="�"}return a},encodeURL(e){return this.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")},decodeURL(e){for(e=e.replace(/-/g,"+").replace(/_/g,"/");e.length%4;)e+="=";return this.decode(e)}},b=e=>{const a=(e,a)=>{const t=(65535&e)+(65535&a);return(e>>16)+(a>>16)+(t>>16)<<16|65535&t},t=(e,t,o,i,n,r)=>{return a((l=a(a(t,e),a(i,r)))<<(s=n)|l>>>32-s,o);var l,s},o=(e,a,o,i,n,r,l)=>t(a&o|~a&i,e,a,n,r,l),i=(e,a,o,i,n,r,l)=>t(a&i|o&~i,e,a,n,r,l),n=(e,a,o,i,n,r,l)=>t(a^o^i,e,a,n,r,l),r=(e,a,o,i,n,r,l)=>t(o^(a|~i),e,a,n,r,l),l=e.length,s=1+(l+8>>6),d=new Array(16*s).fill(0);for(let a=0;a>2]|=e[a]<>2]|=128<{let a="";for(let t=0;t<4;t++)a+=("0"+(e>>8*t&255).toString(16)).slice(-2);return a})).join("")};class k{constructor(e){this.queue=[],this.runningTasks=0,this.totalTasks=0,this.completedTasks=0,this.hasFailedTasks=!1,this.downloadedSize=0,this.maxConcurrency=e}addTask(e){return m(this,void 0,void 0,(function*(){return this.totalTasks++,new Promise(((a,t)=>{if(this.hasFailedTasks)return void a(void 0);const o=()=>m(this,void 0,void 0,(function*(){if(this.hasFailedTasks)return this.completedTasks++,void a(void 0);try{this.runningTasks++;const t=yield e();return this.completedTasks++,a(t),t}catch(e){throw this.completedTasks++,t(e),e}finally{this.runningTasks--,this.runNext()}}));this.runningTasks0;){const e=this.queue.shift();e&&e()}else if(this.queue.length>0&&this.runningTasks"application/json"===e?"json":e.startsWith("image/")?e.split("/")[1]:"application/zip"===e?"zip":"application/epub+zip"===e?"epub":"text/plain"===e?"txt":"application/pdf"===e?"pdf":"application/x-mobipocket-ebook"===e?"mobi":"application/vnd.amazon.ebook"===e?"azw3":"application/x-cbz"===e?"cbz":"application/x-cbr"===e?"cbr":"application/x-cbt"===e?"cbt":"application/x-cb7"===e?"cb7":"application/x-fictionbook+xml"===e?"fb2":"text/html"===e?"html":"text/css"===e?"css":"application/javascript"===e?"js":"application/xml"===e?"xml":"application/xhtml+xml"===e?"xhtml":"application/oebps-package+xml"===e?"opf":"application/x-dtbncx+xml"===e?"ncx":"audio/mpeg"===e?"mp3":"audio/wav"===e?"wav":"audio/ogg"===e?"ogg":"video/mp4"===e?"mp4":"video/webm"===e?"webm":"video/x-msvideo"===e?"avi":"video/x-ms-wmv"===e?"wmv":"video/x-flv"===e?"flv":"application/x-mpegURL"===e?"m3u8":"video/MP2T"===e?"ts":"video/3gpp"===e?"3gp":"video/3gpp2"===e?"3g2":"application/x-sqlite3"===e?"db":"",databaseList:h,configList:["themeColors","readingTime","appVersion","cloudSyncTime","lastSyncTime","recentBooks","koreaderBooks","recentAdd","deletedBooks","favoriteBooks","shelfList","txtParsers","aiModelConfig","readingStats","noteTags","recordLocation","thirdpartyToken","sortedShelfList","kindleDeviceList","thirdpartyToken","opdsCatalogs","opdsCatalogList"],copyArrayBuffer:e=>{var a=new ArrayBuffer(e.byteLength);return new Uint8Array(a).set(new Uint8Array(e)),a},base64ToArrayBuffer:g,arrayBufferToBase64:f,generateSHA256Hash:y,simpleEncrypt:function(e,a){if(!e||!a)return"";const t=N((new TextEncoder).encode(a)),o=Array.from(new Uint8Array(t)),i=(new TextEncoder).encode(e),n=new Uint8Array(i.length);for(let e=0;e{const a=new Set(["anthropic","zhipu","doubao","moonshot","deepseek","minimax","minimaxi"]),t=new Set(["qwen","hunyuan","siliconflow","siliconflowglobal","infini"]),o=new Set(["sensenova","openai"]),i=new Set(["ollama"]);return e&&"custom"!==e?a.has(e)?{thinking:{type:"disabled"}}:t.has(e)?{enable_thinking:!1}:o.has(e)?{reasoning_effort:"none"}:i.has(e)?{think:!1}:{}:{}},EmailProviders:["gmail.com","qq.com","163.com","yahoo.com","sina.com","sina.cn","126.com","outlook.com","yeah.net","foxmail.com","hotmail.com","protonmail.com","proton.me","icloud.com","mail.com","live.com","live.cn","msn.cn","msn.com","aliyun.com","sohu.com","yandex.com","naver.com","mail.ru","yahoo.co.jp","139.com","189.com","yandex.ru","189.cn"],Base64:v};const E={cloudUrl:"https://cloud.koodoreader.com",cloudCNUrl:"https://cloud.koodoreader.cn",testUrl:"https://cloudtest.960960.xyz",devUrl:"http://192.168.28.159:8000"},C={callbackUrl:"https://web.koodoreader.com/",cnCallbackUrl:"https://web.koodoreader.cn/",dropboxClientId:"vnc67byrssocvy1",yandexClientId:"e5305b62f53844b1994f77a840fd0a37",pcloudClientId:"pg8ten0B3vH",boxClientId:"ltimecqanmpxoaicn9qw3es6l3sdl1ya",duboxClientId:"kc0Ls6xLZugGgLLVhZ8yhUU1cRkRoKNU",yiyiwuClientId:"100197197",microsoftClientId:"506df58a-29ab-4020-afc5-6f423dc80f35",googleClientId:"1051055003225-ph1f5fvh328dhv7bco5jitlnfhg6ks2t.apps.googleusercontent.com",appleClientId:"com.koodoreader.auth",facebookClientId:"2845583825559500",githubClientId:"Ov23liJVzfvJMMEEZ8v2",adriveClientId:"a128ae7b9c094545af623de61dc0a1ef"},T={google:{clientId:C.googleClientId,scopes:["openid email profile"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"openid email profile"}},microsoft:{clientId:C.microsoftClientId,scopes:["openid","profile","User.Read","offline_access"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"openid profile User.Read offline_access"}},facebook:{clientId:C.facebookClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:""}},github:{clientId:C.githubClientId,scopes:["user:email"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"user:email"}},apple:{clientId:C.appleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{}},email:{clientId:"",scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:""}}},w=["backgroundColor","textColor","fontSize","margin","letterSpacing","paraSpacing","scale","brightness","fontFamily","subFontFamily","lineHeight","textAlign","textOrientation","convertChinese","selectAction","fullTranslationMode","readerMode","pdfReaderMode","isBold","isIndent","isSliding","isUnderline","isShadow","isItalic","isInvert","isBionic","isHyphenation","isOrphanWidow","isKeepPDFBackground","isAllowScript","isStartFromEven"];var A={CloudMode:"production",CloudConfig:E,ConvertLangMap:{en:"English",zhCN:"Chinese",zhTW:"Chinese",zhMO:"Chinese",tr:"Turkish",ar:"Arabic",ro:"Romanian",pl:"Polish",cs:"Czech",ja:"Japanese",ta:"Tamil",uk:"Ukrainian",sl:"Slovenian",bo:"Tibetan",id:"Indonesian",hy:"Armenian",el:"Greek",hu:"Hungarian",hi:"Hindi",bg:"Bulgarian",nl:"Dutch",it:"Italian",bn:"Bengali",tl:"Tagalog",sv:"Swedish",ga:"Irish",ko:"Korean",de:"German",ru:"Russian",es:"Spanish",fr:"French",fa:"Persian",ptBR:"Portuguese",th:"Thai",sr:"Serbian",am:"Amharic",da:"Danish",fi:"Finnish",ie:"Interlingue",pt:"Portuguese",vi:"Vietnamese"},ContentRegxConfig:[{label:"Default parser",value:"Default parser",subtitle:"Suitable for most txt files",regex:""},{label:"Chinese novel parser",value:"Chinese novel parser",subtitle:"Suitable for most Chinese novels, eg. 第一章,第2回",regex:"^\\s*(第[0-9一二三四五六七八九十百千万零壹贰叁肆伍陆柒捌玖拾佰仟]+[章回])\\s*"},{label:"English novel parser",value:"English novel parser",subtitle:"Suitable for most English novels, eg. Chapter 1, Part II",regex:"^\\s*(Chapter|Part|Book|CHAPTER|PART|BOOK)\\s*"},{label:"Number parser",value:"Number parser",subtitle:"Suitable for novels with number chapter titles, eg. 1, 2, 3",regex:"^\\s*([0-9]+[\\s.、::·\\-—]+|[一二三四五六七八九十百千万零]+[\\s.、::·\\-—]+).+"}],StyleKeys:w,ThirdpartyConfig:C,LoginAuthRequest:T,LoginDiscovery:{microsoft:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"},facebook:{authorizationEndpoint:"https://www.facebook.com/v12.0/dialog/oauth",tokenEndpoint:"https://graph.facebook.com/v12.0/oauth/access_token"},github:{authorizationEndpoint:"https://github.com/login/oauth/authorize",tokenEndpoint:"https://github.com/login/oauth/access_token"},apple:{authorizationEndpoint:"https://appleid.apple.com/auth/authorize",tokenEndpoint:"https://appleid.apple.com/auth/token"},email:{authorizationEndpoint:"",tokenEndpoint:""}},DriveAuthRequest:{dropbox:{clientId:C.dropboxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{token_access_type:"offline"}},yandex:{clientId:C.yandexClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code",force_confirm:"true"}},boxnet:{clientId:C.boxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}},pcloud:{clientId:C.pcloudClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code"}},dubox:{clientId:C.duboxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code",scope:"basic,netdisk",device_id:"119827642",qrcode:"1"}},yiyiwu:{clientId:C.yiyiwuClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code"}},adrive:{clientId:C.adriveClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}},microsoft:{clientId:C.microsoftClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"files.readwrite.appfolder offline_access"}},google:{clientId:C.googleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"https://www.googleapis.com/auth/drive.file",access_type:"offline"}},microsoft_exp:{clientId:C.microsoftClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"files.readwrite.all offline_access"}},google_exp:{clientId:C.googleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"https://www.googleapis.com/auth/drive",access_type:"offline"}}},DriveDiscovery:{dropbox:{authorizationEndpoint:"https://www.dropbox.com/oauth2/authorize",tokenEndpoint:"https://www.dropbox.com/oauth2/token"},yandex:{authorizationEndpoint:"https://oauth.yandex.com/authorize",tokenEndpoint:"https://oauth.yandex.com/token"},boxnet:{authorizationEndpoint:"https://account.box.com/api/oauth2/authorize",tokenEndpoint:"https://api.box.com/oauth2/token"},pcloud:{authorizationEndpoint:"https://my.pcloud.com/oauth2/authorize",tokenEndpoint:"https://api.pcloud.com/oauth2_token"},dubox:{authorizationEndpoint:"https://openapi.baidu.com/oauth/2.0/authorize",tokenEndpoint:"https://openapi.baidu.com/oauth/2.0/token"},yiyiwu:{authorizationEndpoint:"https://passportapi.115.com/open/authorize",tokenEndpoint:"https://passportapi.115.com/open/authorize"},adrive:{authorizationEndpoint:"https://openapi.alipan.com/oauth/authorize",tokenEndpoint:"https://openapi.alipan.com/oauth/token"},microsoft:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"},microsoft_exp:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google_exp:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"}},AiProviderList:[{id:"custom",name:"Custom model",defaultEndpoint:"",modelsEndpoint:"",isCNAvailable:!0},{id:"openai",name:"OpenAI",defaultEndpoint:"https://api.openai.com/v1",modelsEndpoint:"https://api.openai.com/v1/models"},{id:"anthropic",name:"Anthropic",defaultEndpoint:"https://api.anthropic.com/v1",modelsEndpoint:"https://api.anthropic.com/v1/models"},{id:"google",name:"Google Gemini",defaultEndpoint:"https://generativelanguage.googleapis.com/v1beta/openai",modelsEndpoint:"https://generativelanguage.googleapis.com/v1beta/openai/models"},{id:"deepseek",name:"DeepSeek",defaultEndpoint:"https://api.deepseek.com/v1",modelsEndpoint:"https://api.deepseek.com/v1/models",isCNAvailable:!0},{id:"mistral",name:"Mistral AI",defaultEndpoint:"https://api.mistral.ai/v1",modelsEndpoint:"https://api.mistral.ai/v1/models"},{id:"cohere",name:"Cohere",defaultEndpoint:"https://api.cohere.ai/compatibility/v1",modelsEndpoint:"https://api.cohere.ai/compatibility/v1/models"},{id:"groq",name:"Groq",defaultEndpoint:"https://api.groq.com/openai/v1",modelsEndpoint:"https://api.groq.com/openai/v1/models"},{id:"together",name:"Together AI",defaultEndpoint:"https://api.together.xyz/v1",modelsEndpoint:"https://api.together.xyz/v1/models"},{id:"fireworks",name:"Fireworks AI",defaultEndpoint:"https://api.fireworks.ai/inference/v1",modelsEndpoint:"https://api.fireworks.ai/inference/v1/models"},{id:"perplexity",name:"Perplexity",defaultEndpoint:"https://api.perplexity.ai",modelsEndpoint:"https://api.perplexity.ai/v1/models"},{id:"openrouter",name:"OpenRouter",defaultEndpoint:"https://openrouter.ai/api/v1",modelsEndpoint:"https://openrouter.ai/api/v1/models"},{id:"ai21",name:"AI21 Labs",defaultEndpoint:"https://api.ai21.com/studio/v1",modelsEndpoint:"https://api.ai21.com/studio/v1/models"},{id:"xai",name:"xAI (Grok)",defaultEndpoint:"https://api.x.ai/v1",modelsEndpoint:"https://api.x.ai/v1/models"},{id:"sambanova",name:"SambaNova",defaultEndpoint:"https://api.sambanova.ai/v1",modelsEndpoint:"https://api.sambanova.ai/v1/models"},{id:"cerebras",name:"Cerebras",defaultEndpoint:"https://api.cerebras.ai/v1",modelsEndpoint:"https://api.cerebras.ai/v1/models"},{id:"hyperbolic",name:"Hyperbolic",defaultEndpoint:"https://api.hyperbolic.xyz/v1",modelsEndpoint:"https://api.hyperbolic.xyz/v1/models"},{id:"novita",name:"Novita AI",defaultEndpoint:"https://api.novita.ai/openai",modelsEndpoint:"https://api.novita.ai/openai/models"},{id:"lepton",name:"Lepton AI",defaultEndpoint:"https://llm.lepton.run/api/v1",modelsEndpoint:"https://llm.lepton.run/api/v1/models"},{id:"deepinfra",name:"DeepInfra",defaultEndpoint:"https://api.deepinfra.com/v1/openai",modelsEndpoint:"https://api.deepinfra.com/v1/openai/models"},{id:"replicate",name:"Replicate",defaultEndpoint:"https://api.replicate.com/v1",modelsEndpoint:"https://api.replicate.com/v1/models"},{id:"zhipu",name:"Zhipu AI (智谱)",defaultEndpoint:"https://open.bigmodel.cn/api/paas/v4",modelsEndpoint:"https://open.bigmodel.cn/api/paas/v4/models",isCNAvailable:!0},{id:"qwen",name:"Alibaba Qwen (通义千问)",defaultEndpoint:"https://dashscope.aliyuncs.com/compatible-mode/v1",modelsEndpoint:"https://dashscope.aliyuncs.com/compatible-mode/v1/models",isCNAvailable:!0},{id:"moonshot",name:"Moonshot (月之暗面)",defaultEndpoint:"https://api.moonshot.cn/v1",modelsEndpoint:"https://api.moonshot.cn/v1/models",isCNAvailable:!0},{id:"baidu",name:"Baidu ERNIE (文心一言)",defaultEndpoint:"https://qianfan.baidubce.com/v2",modelsEndpoint:"https://qianfan.baidubce.com/v2/models",isCNAvailable:!0},{id:"doubao",name:"Volcengine Doubao (豆包)",defaultEndpoint:"https://ark.cn-beijing.volces.com/api/v3",modelsEndpoint:"https://ark.cn-beijing.volces.com/api/v3/models",isCNAvailable:!0},{id:"spark",name:"iFlytek Spark (讯飞星火)",defaultEndpoint:"https://spark-api-open.xf-yun.com/v1",modelsEndpoint:"https://spark-api-open.xf-yun.com/v1/models",isCNAvailable:!0},{id:"hunyuan",name:"Tencent Hunyuan (腾讯混元)",defaultEndpoint:"https://api.hunyuan.cloud.tencent.com/v1",modelsEndpoint:"https://api.hunyuan.cloud.tencent.com/v1/models",isCNAvailable:!0},{id:"minimaxi",name:"MiniMax (国内版)",defaultEndpoint:"https://api.minimaxi.com/v1",modelsEndpoint:"https://api.minimaxi.com/v1/models",isCNAvailable:!0},{id:"minimax",name:"MiniMax (国际版)",defaultEndpoint:"https://api.minimax.io/v1",modelsEndpoint:"https://api.minimax.io/v1/models"},{id:"baichuan",name:"Baichuan (百川)",defaultEndpoint:"https://api.baichuan-ai.com/v1",modelsEndpoint:"https://api.baichuan-ai.com/v1/models",isCNAvailable:!0},{id:"stepfun",name:"StepFun (阶跃星辰)",defaultEndpoint:"https://api.stepfun.com/v1",modelsEndpoint:"https://api.stepfun.com/v1/models",isCNAvailable:!0},{id:"lingyi",name:"Lingyiwanwu (零一万物)",defaultEndpoint:"https://api.lingyiwanwu.com/v1",modelsEndpoint:"https://api.lingyiwanwu.com/v1/models",isCNAvailable:!0},{id:"siliconflow",name:"SiliconFlow (硅基流动)",defaultEndpoint:"https://api.siliconflow.cn/v1",modelsEndpoint:"https://api.siliconflow.cn/v1/models",isCNAvailable:!0},{id:"siliconflowglobal",name:"SiliconFlow (国际版)",defaultEndpoint:"https://api.siliconflow.com/v1",modelsEndpoint:"https://api.siliconflow.com/v1/models"},{id:"sensenova",name:"SenseNova (日日新)",defaultEndpoint:"https://token.sensenova.cn/v1",modelsEndpoint:"https://token.sensenova.cn/v1/models",isCNAvailable:!0},{id:"infini",name:"Infini AI (无问芯穹)",defaultEndpoint:"https://cloud.infini-ai.com/maas/v1",modelsEndpoint:"https://cloud.infini-ai.com/maas/v1/models",isCNAvailable:!0},{id:"ollama",name:"Ollama (Local)",defaultEndpoint:"http://localhost:11434/v1",modelsEndpoint:"http://localhost:11434/v1/models",isCNAvailable:!0},{id:"lmstudio",name:"LM Studio (Local)",defaultEndpoint:"http://localhost:1234/v1",modelsEndpoint:"http://localhost:1234/v1/models",isCNAvailable:!0},{id:"vllm",name:"vLLM (Local)",defaultEndpoint:"http://localhost:8000/v1",modelsEndpoint:"http://localhost:8000/v1/models",isCNAvailable:!0},{id:"azure",name:"Azure OpenAI",defaultEndpoint:"",modelsEndpoint:""},{id:"aws_bedrock",name:"AWS Bedrock",defaultEndpoint:"",modelsEndpoint:""}],DefaultPrompts:{aiTranslate:"You are a professional translator. Translate the following text from {from} to {to}. Only return the translated text, no explanations.\n\nText: {text}",aiDict:"You are a professional dictionary assistant. Analyze the word or phrase: {word}\nProvide a comprehensive explanation including pronunciation, definitions, example sentences, and usage notes using {to} as the target language. ",aiAssistance:"You are a helpful reading assistant. The user is reading a book. Here is the context:\n{text}\n\nAnswer the user's question concisely and helpfully, and reply with the same language."},SpeechList:[{label:"English",code:"en",example:"To be, or not to be, that is the question."},{label:"Simplified Chinese",code:"zh",example:"千里之行,始于足下。"},{label:"Japanese",code:"ja",example:"猿も木から落ちる。"},{label:"Korean",code:"ko",example:"가는 날이 장날이다."},{label:"French",code:"fr",example:"Liberté, égalité, fraternité."},{label:"German",code:"de",example:"Der Weg ist das Ziel."},{label:"Spanish",code:"es",example:"La vida es un sueño."},{label:"Italian",code:"it",example:"Dolce far niente."},{label:"Russian",code:"ru",example:"Век живи, век учись."},{label:"Portuguese",code:"pt",example:"Saudade é um sentimento profundo."},{label:"Hindi",code:"hi",example:"सपने वो नहीं जो हम सोते वक्त देखते हैं।"},{label:"Afrikaans",code:"af",example:"Die lewe is 'n geskenk."},{label:"Amharic",code:"am",example:"ዕውቀት ብርሃን ነው።"},{label:"Arabic",code:"ar",example:"العلم نور والجهل ظلام."},{label:"Azerbaijani",code:"az",example:"Elm işıqdır, cəhalət zülmət."},{label:"Bulgarian",code:"bg",example:"Знанието е сила."},{label:"Bengali",code:"bn",example:"জ্ঞানই শক্তি।"},{label:"Bosnian",code:"bs",example:"Znanje je moć."},{label:"Catalan",code:"ca",example:"El saber no ocupa lloc."},{label:"Czech",code:"cs",example:"Bez práce nejsou koláče."},{label:"Welsh",code:"cy",example:"Nid aur popeth melyn."},{label:"Danish",code:"da",example:"Lykken er ikke et sted, men en retning."},{label:"Greek",code:"el",example:"Η γνώση είναι δύναμη."},{label:"Estonian",code:"et",example:"Teadmine on jõud."},{label:"Basque",code:"eu",example:"Jakitea boterea da."},{label:"Persian",code:"fa",example:"دانش قدرت است."},{label:"Finnish",code:"fi",example:"Tieto on valtaa."},{label:"Filipino",code:"fil",example:"Ang kaalaman ay kapangyarihan."},{label:"Irish",code:"ga",example:"Is fearr Gaeilge briste ná Béarla cliste."},{label:"Galician",code:"gl",example:"O saber non ocupa lugar."},{label:"Gujarati",code:"gu",example:"જ્ઞાન શક્તિ છે."},{label:"Hebrew",code:"he",example:"ידע הוא כוח."},{label:"Croatian",code:"hr",example:"Znanje je moć."},{label:"Hungarian",code:"hu",example:"A tudás hatalom."},{label:"Armenian",code:"hy",example:"Գիտելիքը ուժ է."},{label:"Indonesian",code:"id",example:"Pengetahuan adalah kekuatan."},{label:"Icelandic",code:"is",example:"Þekking er máttur."},{label:"Inuktitut",code:"iu",example:"ᐃᓕᓐᓂᐊᕐᓂᖅ ᐱᒻᒪᕆᐅᕗᖅ."},{label:"Javanese",code:"jv",example:"Ilmu iku kelakone kanthi laku."},{label:"Georgian",code:"ka",example:"ცოდნა ძალაა."},{label:"Kazakh",code:"kk",example:"Білім — күш."},{label:"Khmer",code:"km",example:"ចំណេះដឹងគឺជាអំណាច។"},{label:"Kannada",code:"kn",example:"ಜ್ಞಾನವೇ ಶಕ್ತಿ."},{label:"Lao",code:"lo",example:"ຄວາມຮູ້ຄືພະລັງ."},{label:"Lithuanian",code:"lt",example:"Žinios yra jėga."},{label:"Latvian",code:"lv",example:"Zināšanas ir spēks."},{label:"Macedonian",code:"mk",example:"Знаењето е моќ."},{label:"Malayalam",code:"ml",example:"അറിവ് ശക്തിയാണ്."},{label:"Mongolian",code:"mn",example:"Мэдлэг бол хүч."},{label:"Marathi",code:"mr",example:"ज्ञान हीच शक्ती आहे."},{label:"Malay",code:"ms",example:"Ilmu itu cahaya."},{label:"Maltese",code:"mt",example:"L-għarfien huwa l-poter."},{label:"Burmese",code:"my",example:"ဗဟုသုတသည် အားဖြစ်သည်။"},{label:"Norwegian",code:"nb",example:"Kunnskap er makt."},{label:"Nepali",code:"ne",example:"ज्ञान नै शक्ति हो।"},{label:"Dutch",code:"nl",example:"Kennis is macht."},{label:"Odia",code:"or",example:"ଜ୍ଞାନ ହିଁ ଶକ୍ତି।"},{label:"Punjabi",code:"pa",example:"ਗਿਆਨ ਹੀ ਸ਼ਕਤੀ ਹੈ।"},{label:"Polish",code:"pl",example:"Wiedza to potęga."},{label:"Pashto",code:"ps",example:"د پوهې ډیوه روښانه ده."},{label:"Romanian",code:"ro",example:"Cartea este o comoară."},{label:"Sinhala",code:"si",example:"දැනුම බලයකි."},{label:"Slovak",code:"sk",example:"Vedomosti sú sila."},{label:"Slovenian",code:"sl",example:"Znanje je moč."},{label:"Somali",code:"so",example:"Aqoontu waa iftiin."},{label:"Albanian",code:"sq",example:"Dija është fuqi."},{label:"Serbian",code:"sr",example:"Знање је моћ."},{label:"Sundanese",code:"su",example:"Élmu éta cahaya."},{label:"Swedish",code:"sv",example:"Kunskap är makt."},{label:"Swahili",code:"sw",example:"Maarifa ni nguvu."},{label:"Tamil",code:"ta",example:"அறிவே ஆற்றல்."},{label:"Telugu",code:"te",example:"జ్ఞానమే శక్తి."},{label:"Thai",code:"th",example:"ความรู้คือพลัง."},{label:"Turkish",code:"tr",example:"Bilgi güçtür."},{label:"Ukrainian",code:"uk",example:"Знання — сила."},{label:"Urdu",code:"ur",example:"علم ہی طاقت ہے۔"},{label:"Uzbek",code:"uz",example:"Bilim – kuch."},{label:"Vietnamese",code:"vi",example:"Học vấn là sức mạnh."},{label:"Wu Chinese",code:"wuu",example:"学问是力量。"},{label:"Cantonese",code:"yue",example:"知識就係力量。"},{label:"Zulu",code:"zu",example:"Ulwazi lungamandla."}],HighlightStyleTypes:[{value:"background",label:"Highlight background"},{value:"underline",label:"Underline"},{value:"strikethrough",label:"Strikethrough"},{value:"wavy",label:"Wavy underline"}],HighlightPresetColors:{background:["#F3C9C9","#FEF3CD","#CEFACD","#CDE9FA"],underline:["#FF0000","#60A5FA","#FF9900","#2EFF2E"],strikethrough:["#FF0000","#60A5FA","#FF9900","#2EFF2E"],wavy:["#FF0000","#60A5FA","#FF9900","#2EFF2E"]},PresetThemeList:[{key:"yellow",textColor:"rgba(89, 68, 41,1)",backgroundColor:"rgba(233, 216, 188,1)",title:"羊皮"},{key:"green",textColor:"rgba(54, 80, 62,1)",backgroundColor:"rgba(197, 231, 207,1)",title:"护眼"},{key:"light",textColor:"rgba(0,0,0,1)",backgroundColor:"rgba(255,255,255,1)",title:"白天"},{key:"night",textColor:"rgba(255,255,255,1)",backgroundColor:"rgba(44,47,49,1)",title:"黑夜"},{key:"sepia",textColor:"rgba(93, 64, 55,1)",backgroundColor:"rgba(245, 235, 220,1)",title:"古卷"},{key:"blue",textColor:"rgba(28, 52, 84,1)",backgroundColor:"rgba(230, 240, 250,1)",title:"晨雾"},{key:"purple",textColor:"rgba(68, 42, 84,1)",backgroundColor:"rgba(240, 230, 250,1)",title:"紫萝"},{key:"pink",textColor:"rgba(84, 42, 68,1)",backgroundColor:"rgba(250, 235, 245,1)",title:"樱花"},{key:"brown",textColor:"rgba(74, 54, 42,1)",backgroundColor:"rgba(240, 230, 215,1)",title:"木纹"},{key:"gray",textColor:"rgba(64, 64, 64,1)",backgroundColor:"rgba(240, 240, 240,1)",title:"素雅"},{key:"darkgreen",textColor:"rgba(200, 220, 200,1)",backgroundColor:"rgba(25, 35, 30,1)",title:"深林"},{key:"darkblue",textColor:"rgba(200, 210, 230,1)",backgroundColor:"rgba(20, 30, 45,1)",title:"深海"},{key:"coral",textColor:"rgba(84, 50, 42,1)",backgroundColor:"rgba(255, 235, 230,1)",title:"珊瑚"},{key:"mint",textColor:"rgba(42, 74, 64,1)",backgroundColor:"rgba(230, 250, 245,1)",title:"薄荷"},{key:"lavender",textColor:"rgba(54, 42, 74,1)",backgroundColor:"rgba(245, 240, 255,1)",title:"薰衣"},{key:"cream",textColor:"rgba(74, 64, 42,1)",backgroundColor:"rgba(255, 250, 240,1)",title:"奶油"},{key:"darkbrown",textColor:"rgba(230, 215, 200,1)",backgroundColor:"rgba(35, 25, 20,1)",title:"深棕"},{key:"olive",textColor:"rgba(64, 74, 42,1)",backgroundColor:"rgba(240, 245, 230,1)",title:"橄榄"},{key:"rose",textColor:"rgba(84, 42, 54,1)",backgroundColor:"rgba(255, 240, 245,1)",title:"玫瑰"},{key:"slate",textColor:"rgba(54, 64, 74,1)",backgroundColor:"rgba(235, 240, 245,1)",title:"石板"}],OfficialVoiceList:[{name:"af_alloy",gender:"female",displayName:"Alloy",locale:"en-US",language:"English (US)"},{name:"af_aoede",gender:"female",displayName:"Aoede",locale:"en-US",language:"English (US)"},{name:"af_bella",gender:"female",displayName:"Bella",locale:"en-US",language:"English (US)"},{name:"af_heart",gender:"female",displayName:"Heart",locale:"en-US",language:"English (US)"},{name:"af_jessica",gender:"female",displayName:"Jessica",locale:"en-US",language:"English (US)"},{name:"af_kore",gender:"female",displayName:"Kore",locale:"en-US",language:"English (US)"},{name:"af_nicole",gender:"female",displayName:"Nicole",locale:"en-US",language:"English (US)"},{name:"af_nova",gender:"female",displayName:"Nova",locale:"en-US",language:"English (US)"},{name:"af_river",gender:"female",displayName:"River",locale:"en-US",language:"English (US)"},{name:"af_sarah",gender:"female",displayName:"Sarah",locale:"en-US",language:"English (US)"},{name:"af_sky",gender:"female",displayName:"Sky",locale:"en-US",language:"English (US)"},{name:"am_adam",gender:"male",displayName:"Adam",locale:"en-US",language:"English (US)"},{name:"am_echo",gender:"male",displayName:"Echo",locale:"en-US",language:"English (US)"},{name:"am_eric",gender:"male",displayName:"Eric",locale:"en-US",language:"English (US)"},{name:"am_fenrir",gender:"male",displayName:"Fenrir",locale:"en-US",language:"English (US)"},{name:"am_liam",gender:"male",displayName:"Liam",locale:"en-US",language:"English (US)"},{name:"am_michael",gender:"male",displayName:"Michael",locale:"en-US",language:"English (US)"},{name:"am_onyx",gender:"male",displayName:"Onyx",locale:"en-US",language:"English (US)"},{name:"am_puck",gender:"male",displayName:"Puck",locale:"en-US",language:"English (US)"},{name:"am_santa",gender:"male",displayName:"Santa",locale:"en-US",language:"English (US)"},{name:"bf_alice",gender:"female",displayName:"Alice",locale:"en-GB",language:"English (UK)"},{name:"bf_emma",gender:"female",displayName:"Emma",locale:"en-GB",language:"English (UK)"},{name:"bf_isabella",gender:"female",displayName:"Isabella",locale:"en-GB",language:"English (UK)"},{name:"bf_lily",gender:"female",displayName:"Lily",locale:"en-GB",language:"English (UK)"},{name:"bm_daniel",gender:"male",displayName:"Daniel",locale:"en-GB",language:"English (UK)"},{name:"bm_fable",gender:"male",displayName:"Fable",locale:"en-GB",language:"English (UK)"},{name:"bm_george",gender:"male",displayName:"George",locale:"en-GB",language:"English (UK)"},{name:"bm_lewis",gender:"male",displayName:"Lewis",locale:"en-GB",language:"English (UK)"},{name:"ef_dora",gender:"female",displayName:"Dora",locale:"es-ES",language:"Español"},{name:"em_alex",gender:"male",displayName:"Alex",locale:"es-ES",language:"Español"},{name:"em_santa",gender:"male",displayName:"Santa",locale:"es-ES",language:"Español"},{name:"ff_siwis",gender:"female",displayName:"Siwis",locale:"fr-FR",language:"Français"},{name:"hf_alpha",gender:"female",displayName:"Alpha",locale:"hi-IN",language:"हिन्दी"},{name:"hf_beta",gender:"female",displayName:"Beta",locale:"hi-IN",language:"हिन्दी"},{name:"hm_omega",gender:"male",displayName:"Omega",locale:"hi-IN",language:"हिन्दी"},{name:"hm_psi",gender:"male",displayName:"Psi",locale:"hi-IN",language:"हिन्दी"},{name:"if_sara",gender:"female",displayName:"Sara",locale:"it-IT",language:"Italiano"},{name:"im_nicola",gender:"male",displayName:"Nicola",locale:"it-IT",language:"Italiano"},{name:"jf_alpha",gender:"female",displayName:"Alpha",locale:"ja-JP",language:"日本語"},{name:"jf_gongitsune",gender:"female",displayName:"Gongitsune",locale:"ja-JP",language:"日本語"},{name:"jf_nezumi",gender:"female",displayName:"Nezumi",locale:"ja-JP",language:"日本語"},{name:"jf_tebukuro",gender:"female",displayName:"Tebukuro",locale:"ja-JP",language:"日本語"},{name:"jm_kumo",gender:"male",displayName:"Kumo",locale:"ja-JP",language:"日本語"},{name:"pf_dora",gender:"female",displayName:"Dora",locale:"pt-BR",language:"Português (Brasil)"},{name:"pm_alex",gender:"male",displayName:"Alex",locale:"pt-BR",language:"Português (Brasil)"},{name:"pm_santa",gender:"male",displayName:"Santa",locale:"pt-BR",language:"Português (Brasil)"},{name:"zf_xiaoxiao",gender:"female",displayName:"Xiaoxiao",locale:"zh-CN",language:"中文"},{name:"zm_yunxi",gender:"male",displayName:"Yunxi",locale:"zh-CN",language:"中文"},{name:"zf_xiaoyi",gender:"female",displayName:"Xiaoyi",locale:"zh-CN",language:"中文"},{name:"zm_yunyang",gender:"male",displayName:"Yunyang",locale:"zh-CN",language:"中文"},{name:"zm_yunxia",gender:"male",displayName:"Yunxia",locale:"zh-CN",language:"中文"},{name:"zm_yunjian",gender:"male",displayName:"Yunjian",locale:"zh-CN",language:"中文"},{name:"zf_xiaoni",gender:"female",displayName:"Xiaoni 陕西",locale:"zh-CN",language:"中文"},{name:"zf_xiaobei",gender:"female",displayName:"Xiaobei 辽宁",locale:"zh-CN",language:"中文"}],AzureTTSVoiceList:[{name:"de-DE-AmalaNeural",gender:"female",displayName:"Amala",locale:"de-DE"},{name:"de-DE-BerndNeural",gender:"male",displayName:"Bernd",locale:"de-DE"},{name:"de-DE-ConradNeural",gender:"male",displayName:"Conrad",locale:"de-DE"},{name:"de-DE-KatjaNeural",gender:"female",displayName:"Katja",locale:"de-DE"},{name:"en-GB-LibbyNeural",gender:"female",displayName:"Libby",locale:"en-GB"},{name:"en-GB-RyanNeural",gender:"male",displayName:"Ryan",locale:"en-GB"},{name:"en-GB-SoniaNeural",gender:"female",displayName:"Sonia",locale:"en-GB"},{name:"en-US-AmberNeural",gender:"female",displayName:"Amber",locale:"en-US"},{name:"en-US-AriaNeural",gender:"female",displayName:"Aria",locale:"en-US"},{name:"en-US-ChristopherNeural",gender:"male",displayName:"Christopher",locale:"en-US"},{name:"en-US-DavisNeural",gender:"male",displayName:"Davis",locale:"en-US"},{name:"en-US-EricNeural",gender:"male",displayName:"Eric",locale:"en-US"},{name:"en-US-GuyNeural",gender:"male",displayName:"Guy",locale:"en-US"},{name:"en-US-JaneNeural",gender:"female",displayName:"Jane",locale:"en-US"},{name:"en-US-JennyNeural",gender:"female",displayName:"Jenny",locale:"en-US"},{name:"en-US-MichelleNeural",gender:"female",displayName:"Michelle",locale:"en-US"},{name:"en-US-SaraNeural",gender:"female",displayName:"Sara",locale:"en-US"},{name:"es-ES-AbrilNeural",gender:"female",displayName:"Abril",locale:"es-ES"},{name:"es-ES-AlvaroNeural",gender:"male",displayName:"Álvaro",locale:"es-ES"},{name:"es-ES-ArnauNeural",gender:"male",displayName:"Arnau",locale:"es-ES"},{name:"es-ES-ElviraNeural",gender:"female",displayName:"Elvira",locale:"es-ES"},{name:"fr-FR-DeniseNeural",gender:"female",displayName:"Denise",locale:"fr-FR"},{name:"fr-FR-HenriNeural",gender:"male",displayName:"Henri",locale:"fr-FR"},{name:"it-IT-BenignoNeural",gender:"male",displayName:"Benigno",locale:"it-IT"},{name:"it-IT-DiegoNeural",gender:"male",displayName:"Diego",locale:"it-IT"},{name:"it-IT-ElsaNeural",gender:"female",displayName:"Elsa",locale:"it-IT"},{name:"it-IT-IsabellaNeural",gender:"female",displayName:"Isabella",locale:"it-IT"},{name:"ja-JP-KeitaNeural",gender:"male",displayName:"圭太",locale:"ja-JP"},{name:"ja-JP-NanamiNeural",gender:"female",displayName:"七海",locale:"ja-JP"},{name:"ko-KR-InJoonNeural",gender:"male",displayName:"인준",locale:"ko-KR"},{name:"ko-KR-SoonBokNeural",gender:"female",displayName:"순복",locale:"ko-KR"},{name:"ko-KR-SunHiNeural",gender:"female",displayName:"선히",locale:"ko-KR"},{name:"pt-BR-AntonioNeural",gender:"male",displayName:"Antônio",locale:"pt-BR"},{name:"pt-BR-FranciscaNeural",gender:"female",displayName:"Francisca",locale:"pt-BR"},{name:"pt-PT-DuarteNeural",gender:"male",displayName:"Duarte",locale:"pt-PT"},{name:"pt-PT-RaquelNeural",gender:"female",displayName:"Raquel",locale:"pt-PT"},{name:"ru-RU-DariyaNeural",gender:"female",displayName:"Дария",locale:"ru-RU"},{name:"ru-RU-DmitryNeural",gender:"male",displayName:"Дмитрий",locale:"ru-RU"},{name:"ru-RU-SvetlanaNeural",gender:"female",displayName:"Светлана",locale:"ru-RU"},{name:"yue-CN-XiaoMinNeural",gender:"female",displayName:"晓敏",locale:"yue-CN"},{name:"yue-CN-YunSongNeural",gender:"male",displayName:"云松",locale:"yue-CN"},{name:"zh-CN-XiaoxiaoNeural",gender:"female",displayName:"晓晓",locale:"zh-CN"},{name:"zh-CN-YunxiNeural",gender:"male",displayName:"云希",locale:"zh-CN"},{name:"zh-HK-HiuMaanNeural",gender:"female",displayName:"曉曼",locale:"zh-HK"},{name:"zh-HK-WanLungNeural",gender:"male",displayName:"雲龍",locale:"zh-HK"},{name:"zh-TW-HsiaoChenNeural",gender:"female",displayName:"曉臻",locale:"zh-TW"},{name:"zh-TW-YunJheNeural",gender:"male",displayName:"雲哲",locale:"zh-TW"},{name:"af-ZA-AdriNeural",gender:"female",displayName:"Adri",locale:"af-ZA"},{name:"af-ZA-WillemNeural",gender:"male",displayName:"Willem",locale:"af-ZA"},{name:"sq-AL-AnilaNeural",gender:"female",displayName:"Anila",locale:"sq-AL"},{name:"sq-AL-IlirNeural",gender:"male",displayName:"Ilir",locale:"sq-AL"},{name:"am-ET-AmehaNeural",gender:"male",displayName:"አምሀ",locale:"am-ET"},{name:"am-ET-MekdesNeural",gender:"female",displayName:"መቅደስ",locale:"am-ET"},{name:"ar-DZ-AminaNeural",gender:"female",displayName:"أمينة",locale:"ar-DZ"},{name:"ar-DZ-IsmaelNeural",gender:"male",displayName:"إسماعيل",locale:"ar-DZ"},{name:"ar-BH-AliNeural",gender:"male",displayName:"علي",locale:"ar-BH"},{name:"ar-BH-LailaNeural",gender:"female",displayName:"ليلى",locale:"ar-BH"},{name:"ar-EG-SalmaNeural",gender:"female",displayName:"سلمى",locale:"ar-EG"},{name:"ar-EG-ShakirNeural",gender:"male",displayName:"شاكر",locale:"ar-EG"},{name:"ar-IQ-BasselNeural",gender:"male",displayName:"باسل",locale:"ar-IQ"},{name:"ar-IQ-RanaNeural",gender:"female",displayName:"رنا",locale:"ar-IQ"},{name:"ar-JO-SanaNeural",gender:"female",displayName:"سناء",locale:"ar-JO"},{name:"ar-JO-TaimNeural",gender:"male",displayName:"تيم",locale:"ar-JO"},{name:"ar-KW-FahedNeural",gender:"male",displayName:"فهد",locale:"ar-KW"},{name:"ar-KW-NouraNeural",gender:"female",displayName:"نورا",locale:"ar-KW"},{name:"ar-LB-LaylaNeural",gender:"female",displayName:"ليلى",locale:"ar-LB"},{name:"ar-LB-RamiNeural",gender:"male",displayName:"رامي",locale:"ar-LB"},{name:"ar-LY-ImanNeural",gender:"female",displayName:"إيمان",locale:"ar-LY"},{name:"ar-LY-OmarNeural",gender:"male",displayName:"أحمد",locale:"ar-LY"},{name:"ar-MA-JamalNeural",gender:"male",displayName:"جمال",locale:"ar-MA"},{name:"ar-MA-MounaNeural",gender:"female",displayName:"منى",locale:"ar-MA"},{name:"ar-OM-AbdullahNeural",gender:"male",displayName:"عبدالله",locale:"ar-OM"},{name:"ar-OM-AyshaNeural",gender:"female",displayName:"عائشة",locale:"ar-OM"},{name:"ar-QA-AmalNeural",gender:"female",displayName:"أمل",locale:"ar-QA"},{name:"ar-QA-MoazNeural",gender:"male",displayName:"معاذ",locale:"ar-QA"},{name:"ar-SA-HamedNeural",gender:"male",displayName:"حامد",locale:"ar-SA"},{name:"ar-SA-ZariyahNeural",gender:"female",displayName:"زارية",locale:"ar-SA"},{name:"ar-SY-AmanyNeural",gender:"female",displayName:"أماني",locale:"ar-SY"},{name:"ar-SY-LaithNeural",gender:"male",displayName:"ليث",locale:"ar-SY"},{name:"ar-TN-HediNeural",gender:"male",displayName:"هادي",locale:"ar-TN"},{name:"ar-TN-ReemNeural",gender:"female",displayName:"ريم",locale:"ar-TN"},{name:"ar-AE-FatimaNeural",gender:"female",displayName:"فاطمة",locale:"ar-AE"},{name:"ar-AE-HamdanNeural",gender:"male",displayName:"حمدان",locale:"ar-AE"},{name:"ar-YE-MaryamNeural",gender:"female",displayName:"مريم",locale:"ar-YE"},{name:"ar-YE-SalehNeural",gender:"male",displayName:"صالح",locale:"ar-YE"},{name:"az-AZ-BabekNeural",gender:"male",displayName:"Babək",locale:"az-AZ"},{name:"az-AZ-BanuNeural",gender:"female",displayName:"Banu",locale:"az-AZ"},{name:"bn-BD-NabanitaNeural",gender:"female",displayName:"নবনীতা",locale:"bn-BD"},{name:"bn-BD-PradeepNeural",gender:"male",displayName:"প্রদ্বীপ",locale:"bn-BD"},{name:"bn-IN-BashkarNeural",gender:"male",displayName:"ভাস্কর",locale:"bn-IN"},{name:"bn-IN-TanishaaNeural",gender:"female",displayName:"তানিশা",locale:"bn-IN"},{name:"bs-BA-VesnaNeural",gender:"female",displayName:"Vesna",locale:"bs-BA"},{name:"bs-BA-GoranNeural",gender:"male",displayName:"Goran",locale:"bs-BA"},{name:"bg-BG-BorislavNeural",gender:"male",displayName:"Борислав",locale:"bg-BG"},{name:"bg-BG-KalinaNeural",gender:"female",displayName:"Калина",locale:"bg-BG"},{name:"my-MM-NilarNeural",gender:"female",displayName:"နီလာ",locale:"my-MM"},{name:"my-MM-ThihaNeural",gender:"male",displayName:"သီဟ",locale:"my-MM"},{name:"ca-ES-EnricNeural",gender:"male",displayName:"Enric",locale:"ca-ES"},{name:"ca-ES-JoanaNeural",gender:"female",displayName:"Joana",locale:"ca-ES"},{name:"zh-HK-HiuGaaiNeural",gender:"female",displayName:"曉佳",locale:"zh-HK"},{name:"zh-CN-XiaoyiNeural",gender:"female",displayName:"晓伊",locale:"zh-CN"},{name:"zh-CN-YunjianNeural",gender:"male",displayName:"云健",locale:"zh-CN"},{name:"zh-CN-YunxiaNeural",gender:"male",displayName:"云夏",locale:"zh-CN"},{name:"zh-CN-YunyangNeural",gender:"male",displayName:"云扬",locale:"zh-CN"},{name:"zh-CN-liaoning-XiaobeiNeural",gender:"female",displayName:"晓北 辽宁",locale:"zh-CN"},{name:"zh-CN-shaanxi-XiaoniNeural",gender:"female",displayName:"晓妮 陕西",locale:"zh-CN"},{name:"zh-TW-HsiaoYuNeural",gender:"female",displayName:"曉雨",locale:"zh-TW"},{name:"hr-HR-GabrijelaNeural",gender:"female",displayName:"Gabrijela",locale:"hr-HR"},{name:"hr-HR-SreckoNeural",gender:"male",displayName:"Srećko",locale:"hr-HR"},{name:"cs-CZ-AntoninNeural",gender:"male",displayName:"Antonín",locale:"cs-CZ"},{name:"cs-CZ-VlastaNeural",gender:"female",displayName:"Vlasta",locale:"cs-CZ"},{name:"da-DK-ChristelNeural",gender:"female",displayName:"Christel",locale:"da-DK"},{name:"da-DK-JeppeNeural",gender:"male",displayName:"Jeppe",locale:"da-DK"},{name:"nl-BE-ArnaudNeural",gender:"male",displayName:"Arnaud",locale:"nl-BE"},{name:"nl-BE-DenaNeural",gender:"female",displayName:"Dena",locale:"nl-BE"},{name:"nl-NL-ColetteNeural",gender:"female",displayName:"Colette",locale:"nl-NL"},{name:"nl-NL-FennaNeural",gender:"female",displayName:"Fenna",locale:"nl-NL"},{name:"nl-NL-MaartenNeural",gender:"male",displayName:"Maarten",locale:"nl-NL"},{name:"en-AU-WilliamMultilingualNeural",gender:"male",displayName:"William Multilingual",locale:"en-AU"},{name:"en-AU-NatashaNeural",gender:"female",displayName:"Natasha",locale:"en-AU"},{name:"en-CA-ClaraNeural",gender:"female",displayName:"Clara",locale:"en-CA"},{name:"en-CA-LiamNeural",gender:"male",displayName:"Liam",locale:"en-CA"},{name:"en-HK-YanNeural",gender:"female",displayName:"Yan",locale:"en-HK"},{name:"en-HK-SamNeural",gender:"male",displayName:"Sam",locale:"en-HK"},{name:"en-IN-NeerjaNeural",gender:"female",displayName:"Neerja",locale:"en-IN"},{name:"en-IN-PrabhatNeural",gender:"male",displayName:"Prabhat",locale:"en-IN"},{name:"en-IE-ConnorNeural",gender:"male",displayName:"Connor",locale:"en-IE"},{name:"en-IE-EmilyNeural",gender:"female",displayName:"Emily",locale:"en-IE"},{name:"en-KE-AsiliaNeural",gender:"female",displayName:"Asilia",locale:"en-KE"},{name:"en-KE-ChilembaNeural",gender:"male",displayName:"Chilemba",locale:"en-KE"},{name:"en-NZ-MitchellNeural",gender:"male",displayName:"Mitchell",locale:"en-NZ"},{name:"en-NZ-MollyNeural",gender:"female",displayName:"Molly",locale:"en-NZ"},{name:"en-NG-AbeoNeural",gender:"male",displayName:"Abeo",locale:"en-NG"},{name:"en-NG-EzinneNeural",gender:"female",displayName:"Ezinne",locale:"en-NG"},{name:"en-PH-JamesNeural",gender:"male",displayName:"James",locale:"en-PH"},{name:"en-PH-RosaNeural",gender:"female",displayName:"Rosa",locale:"en-PH"},{name:"en-US-AvaNeural",gender:"female",displayName:"Ava",locale:"en-US"},{name:"en-US-AndrewNeural",gender:"male",displayName:"Andrew",locale:"en-US"},{name:"en-US-EmmaNeural",gender:"female",displayName:"Emma",locale:"en-US"},{name:"en-US-BrianNeural",gender:"male",displayName:"Brian",locale:"en-US"},{name:"en-SG-LunaNeural",gender:"female",displayName:"Luna",locale:"en-SG"},{name:"en-SG-WayneNeural",gender:"male",displayName:"Wayne",locale:"en-SG"},{name:"en-ZA-LeahNeural",gender:"female",displayName:"Leah",locale:"en-ZA"},{name:"en-ZA-LukeNeural",gender:"male",displayName:"Luke",locale:"en-ZA"},{name:"en-TZ-ElimuNeural",gender:"male",displayName:"Elimu",locale:"en-TZ"},{name:"en-TZ-ImaniNeural",gender:"female",displayName:"Imani",locale:"en-TZ"},{name:"en-GB-MaisieNeural",gender:"female",displayName:"Maisie",locale:"en-GB"},{name:"en-GB-ThomasNeural",gender:"male",displayName:"Thomas",locale:"en-GB"},{name:"en-US-AnaNeural",gender:"female",displayName:"Ana",locale:"en-US"},{name:"en-US-AndrewMultilingualNeural",gender:"male",displayName:"Andrew Multilingual",locale:"en-US"},{name:"en-US-AvaMultilingualNeural",gender:"female",displayName:"Ava Multilingual",locale:"en-US"},{name:"en-US-BrianMultilingualNeural",gender:"male",displayName:"Brian Multilingual",locale:"en-US"},{name:"en-US-EmmaMultilingualNeural",gender:"female",displayName:"Emma Multilingual",locale:"en-US"},{name:"en-US-RogerNeural",gender:"male",displayName:"Roger",locale:"en-US"},{name:"en-US-SteffanNeural",gender:"male",displayName:"Steffan",locale:"en-US"},{name:"et-EE-AnuNeural",gender:"female",displayName:"Anu",locale:"et-EE"},{name:"et-EE-KertNeural",gender:"male",displayName:"Kert",locale:"et-EE"},{name:"fil-PH-AngeloNeural",gender:"male",displayName:"Angelo",locale:"fil-PH"},{name:"fil-PH-BlessicaNeural",gender:"female",displayName:"Blessica",locale:"fil-PH"},{name:"fi-FI-HarriNeural",gender:"male",displayName:"Harri",locale:"fi-FI"},{name:"fi-FI-NooraNeural",gender:"female",displayName:"Noora",locale:"fi-FI"},{name:"fr-BE-CharlineNeural",gender:"female",displayName:"Charline",locale:"fr-BE"},{name:"fr-BE-GerardNeural",gender:"male",displayName:"Gerard",locale:"fr-BE"},{name:"fr-CA-ThierryNeural",gender:"male",displayName:"Thierry",locale:"fr-CA"},{name:"fr-CA-AntoineNeural",gender:"male",displayName:"Antoine",locale:"fr-CA"},{name:"fr-CA-JeanNeural",gender:"male",displayName:"Jean",locale:"fr-CA"},{name:"fr-CA-SylvieNeural",gender:"female",displayName:"Sylvie",locale:"fr-CA"},{name:"fr-FR-VivienneMultilingualNeural",gender:"female",displayName:"Vivienne Multilingue",locale:"fr-FR"},{name:"fr-FR-RemyMultilingualNeural",gender:"male",displayName:"Rémy Multilingue",locale:"fr-FR"},{name:"fr-FR-EloiseNeural",gender:"female",displayName:"Eloise",locale:"fr-FR"},{name:"fr-CH-ArianeNeural",gender:"female",displayName:"Ariane",locale:"fr-CH"},{name:"fr-CH-FabriceNeural",gender:"male",displayName:"Fabrice",locale:"fr-CH"},{name:"gl-ES-RoiNeural",gender:"male",displayName:"Roi",locale:"gl-ES"},{name:"gl-ES-SabelaNeural",gender:"female",displayName:"Sabela",locale:"gl-ES"},{name:"ka-GE-EkaNeural",gender:"female",displayName:"ეკა",locale:"ka-GE"},{name:"ka-GE-GiorgiNeural",gender:"male",displayName:"გიორგი",locale:"ka-GE"},{name:"de-AT-IngridNeural",gender:"female",displayName:"Ingrid",locale:"de-AT"},{name:"de-AT-JonasNeural",gender:"male",displayName:"Jonas",locale:"de-AT"},{name:"de-DE-SeraphinaMultilingualNeural",gender:"female",displayName:"Seraphine Mehrsprachig",locale:"de-DE"},{name:"de-DE-FlorianMultilingualNeural",gender:"male",displayName:"Florian Mehrsprachig",locale:"de-DE"},{name:"de-DE-KillianNeural",gender:"male",displayName:"Killian",locale:"de-DE"},{name:"de-CH-JanNeural",gender:"male",displayName:"Jan",locale:"de-CH"},{name:"de-CH-LeniNeural",gender:"female",displayName:"Leni",locale:"de-CH"},{name:"el-GR-AthinaNeural",gender:"female",displayName:"Αθηνά",locale:"el-GR"},{name:"el-GR-NestorasNeural",gender:"male",displayName:"Νέστορας",locale:"el-GR"},{name:"gu-IN-DhwaniNeural",gender:"female",displayName:"ધ્વની",locale:"gu-IN"},{name:"gu-IN-NiranjanNeural",gender:"male",displayName:"નિરંજન",locale:"gu-IN"},{name:"he-IL-AvriNeural",gender:"male",displayName:"אברי",locale:"he-IL"},{name:"he-IL-HilaNeural",gender:"female",displayName:"הילה",locale:"he-IL"},{name:"hi-IN-MadhurNeural",gender:"male",displayName:"मधुर",locale:"hi-IN"},{name:"hi-IN-SwaraNeural",gender:"female",displayName:"स्वरा",locale:"hi-IN"},{name:"hu-HU-NoemiNeural",gender:"female",displayName:"Noémi",locale:"hu-HU"},{name:"hu-HU-TamasNeural",gender:"male",displayName:"Tamás",locale:"hu-HU"},{name:"is-IS-GudrunNeural",gender:"female",displayName:"Guðrún",locale:"is-IS"},{name:"is-IS-GunnarNeural",gender:"male",displayName:"Gunnar",locale:"is-IS"},{name:"id-ID-ArdiNeural",gender:"male",displayName:"Ardi",locale:"id-ID"},{name:"id-ID-GadisNeural",gender:"female",displayName:"Gadis",locale:"id-ID"},{name:"iu-Latn-CA-SiqiniqNeural",gender:"female",displayName:"ᓯᕿᓂᖅ",locale:"iu-Latn-CA"},{name:"iu-Latn-CA-TaqqiqNeural",gender:"male",displayName:"ᑕᖅᑭᖅ",locale:"iu-Latn-CA"},{name:"iu-Cans-CA-SiqiniqNeural",gender:"female",displayName:"ᓯᕿᓂᖅ",locale:"iu-Cans-CA"},{name:"iu-Cans-CA-TaqqiqNeural",gender:"male",displayName:"ᑕᖅᑭᖅ",locale:"iu-Cans-CA"},{name:"ga-IE-ColmNeural",gender:"male",displayName:"Colm",locale:"ga-IE"},{name:"ga-IE-OrlaNeural",gender:"female",displayName:"Orla",locale:"ga-IE"},{name:"it-IT-GiuseppeMultilingualNeural",gender:"male",displayName:"Giuseppe Multilingual",locale:"it-IT"},{name:"jv-ID-DimasNeural",gender:"male",displayName:"Dimas",locale:"jv-ID"},{name:"jv-ID-SitiNeural",gender:"female",displayName:"Siti",locale:"jv-ID"},{name:"kn-IN-GaganNeural",gender:"male",displayName:"ಗಗನ್",locale:"kn-IN"},{name:"kn-IN-SapnaNeural",gender:"female",displayName:"ಸಪ್ನಾ",locale:"kn-IN"},{name:"kk-KZ-AigulNeural",gender:"female",displayName:"Айгүл",locale:"kk-KZ"},{name:"kk-KZ-DauletNeural",gender:"male",displayName:"Дәулет",locale:"kk-KZ"},{name:"km-KH-PisethNeural",gender:"male",displayName:"ពិសិដ្ឋ",locale:"km-KH"},{name:"km-KH-SreymomNeural",gender:"female",displayName:"ស្រីមុំ",locale:"km-KH"},{name:"ko-KR-HyunsuMultilingualNeural",gender:"male",displayName:"Hyunsu Multilingual",locale:"ko-KR"},{name:"lo-LA-ChanthavongNeural",gender:"male",displayName:"ຈັນທະວົງ",locale:"lo-LA"},{name:"lo-LA-KeomanyNeural",gender:"female",displayName:"ແກ້ວມະນີ",locale:"lo-LA"},{name:"lv-LV-EveritaNeural",gender:"female",displayName:"Everita",locale:"lv-LV"},{name:"lv-LV-NilsNeural",gender:"male",displayName:"Nils",locale:"lv-LV"},{name:"lt-LT-LeonasNeural",gender:"male",displayName:"Leonas",locale:"lt-LT"},{name:"lt-LT-OnaNeural",gender:"female",displayName:"Ona",locale:"lt-LT"},{name:"mk-MK-AleksandarNeural",gender:"male",displayName:"Александар",locale:"mk-MK"},{name:"mk-MK-MarijaNeural",gender:"female",displayName:"Марија",locale:"mk-MK"},{name:"ms-MY-OsmanNeural",gender:"male",displayName:"Osman",locale:"ms-MY"},{name:"ms-MY-YasminNeural",gender:"female",displayName:"Yasmin",locale:"ms-MY"},{name:"ml-IN-MidhunNeural",gender:"male",displayName:"മിഥുൻ",locale:"ml-IN"},{name:"ml-IN-SobhanaNeural",gender:"female",displayName:"ശോഭന",locale:"ml-IN"},{name:"mt-MT-GraceNeural",gender:"female",displayName:"Grace",locale:"mt-MT"},{name:"mt-MT-JosephNeural",gender:"male",displayName:"Joseph",locale:"mt-MT"},{name:"mr-IN-AarohiNeural",gender:"female",displayName:"आरोही",locale:"mr-IN"},{name:"mr-IN-ManoharNeural",gender:"male",displayName:"मनोहर",locale:"mr-IN"},{name:"mn-MN-BataaNeural",gender:"male",displayName:"Батаа",locale:"mn-MN"},{name:"mn-MN-YesuiNeural",gender:"female",displayName:"Есүй",locale:"mn-MN"},{name:"ne-NP-HemkalaNeural",gender:"female",displayName:"हेमकला",locale:"ne-NP"},{name:"ne-NP-SagarNeural",gender:"male",displayName:"सागर",locale:"ne-NP"},{name:"nb-NO-FinnNeural",gender:"male",displayName:"Finn",locale:"nb-NO"},{name:"nb-NO-PernilleNeural",gender:"female",displayName:"Pernille",locale:"nb-NO"},{name:"ps-AF-GulNawazNeural",gender:"male",displayName:" ګل نواز",locale:"ps-AF"},{name:"ps-AF-LatifaNeural",gender:"female",displayName:"لطيفه",locale:"ps-AF"},{name:"fa-IR-DilaraNeural",gender:"female",displayName:"دلارا",locale:"fa-IR"},{name:"fa-IR-FaridNeural",gender:"male",displayName:"فرید",locale:"fa-IR"},{name:"pl-PL-MarekNeural",gender:"male",displayName:"Marek",locale:"pl-PL"},{name:"pl-PL-ZofiaNeural",gender:"female",displayName:"Zofia",locale:"pl-PL"},{name:"pt-BR-ThalitaMultilingualNeural",gender:"female",displayName:"Thalita multilíngue",locale:"pt-BR"},{name:"ro-RO-AlinaNeural",gender:"female",displayName:"Alina",locale:"ro-RO"},{name:"ro-RO-EmilNeural",gender:"male",displayName:"Emil",locale:"ro-RO"},{name:"sr-RS-NicholasNeural",gender:"male",displayName:"Никола",locale:"sr-RS"},{name:"sr-RS-SophieNeural",gender:"female",displayName:"Софија",locale:"sr-RS"},{name:"si-LK-SameeraNeural",gender:"male",displayName:"සමීර",locale:"si-LK"},{name:"si-LK-ThiliniNeural",gender:"female",displayName:"තිළිණි",locale:"si-LK"},{name:"sk-SK-LukasNeural",gender:"male",displayName:"Lukáš",locale:"sk-SK"},{name:"sk-SK-ViktoriaNeural",gender:"female",displayName:"Viktória",locale:"sk-SK"},{name:"sl-SI-PetraNeural",gender:"female",displayName:"Petra",locale:"sl-SI"},{name:"sl-SI-RokNeural",gender:"male",displayName:"Rok",locale:"sl-SI"},{name:"so-SO-MuuseNeural",gender:"male",displayName:"Muuse",locale:"so-SO"},{name:"so-SO-UbaxNeural",gender:"female",displayName:"Ubax",locale:"so-SO"},{name:"es-AR-ElenaNeural",gender:"female",displayName:"Elena",locale:"es-AR"},{name:"es-AR-TomasNeural",gender:"male",displayName:"Tomas",locale:"es-AR"},{name:"es-BO-MarceloNeural",gender:"male",displayName:"Marcelo",locale:"es-BO"},{name:"es-BO-SofiaNeural",gender:"female",displayName:"Sofia",locale:"es-BO"},{name:"es-CL-CatalinaNeural",gender:"female",displayName:"Catalina",locale:"es-CL"},{name:"es-CL-LorenzoNeural",gender:"male",displayName:"Lorenzo",locale:"es-CL"},{name:"es-CO-GonzaloNeural",gender:"male",displayName:"Gonzalo",locale:"es-CO"},{name:"es-CO-SalomeNeural",gender:"female",displayName:"Salome",locale:"es-CO"},{name:"es-ES-XimenaNeural",gender:"female",displayName:"Ximena",locale:"es-ES"},{name:"es-CR-JuanNeural",gender:"male",displayName:"Juan",locale:"es-CR"},{name:"es-CR-MariaNeural",gender:"female",displayName:"María",locale:"es-CR"},{name:"es-CU-BelkysNeural",gender:"female",displayName:"Belkys",locale:"es-CU"},{name:"es-CU-ManuelNeural",gender:"male",displayName:"Manuel",locale:"es-CU"},{name:"es-DO-EmilioNeural",gender:"male",displayName:"Emilio",locale:"es-DO"},{name:"es-DO-RamonaNeural",gender:"female",displayName:"Ramona",locale:"es-DO"},{name:"es-EC-AndreaNeural",gender:"female",displayName:"Andrea",locale:"es-EC"},{name:"es-EC-LuisNeural",gender:"male",displayName:"Luis",locale:"es-EC"},{name:"es-SV-LorenaNeural",gender:"female",displayName:"Lorena",locale:"es-SV"},{name:"es-SV-RodrigoNeural",gender:"male",displayName:"Rodrigo",locale:"es-SV"},{name:"es-GQ-JavierNeural",gender:"male",displayName:"Javier",locale:"es-GQ"},{name:"es-GQ-TeresaNeural",gender:"female",displayName:"Teresa",locale:"es-GQ"},{name:"es-GT-AndresNeural",gender:"male",displayName:"Andrés",locale:"es-GT"},{name:"es-GT-MartaNeural",gender:"female",displayName:"Marta",locale:"es-GT"},{name:"es-HN-CarlosNeural",gender:"male",displayName:"Carlos",locale:"es-HN"},{name:"es-HN-KarlaNeural",gender:"female",displayName:"Karla",locale:"es-HN"},{name:"es-MX-DaliaNeural",gender:"female",displayName:"Dalia",locale:"es-MX"},{name:"es-MX-JorgeNeural",gender:"male",displayName:"Jorge",locale:"es-MX"},{name:"es-NI-FedericoNeural",gender:"male",displayName:"Federico",locale:"es-NI"},{name:"es-NI-YolandaNeural",gender:"female",displayName:"Yolanda",locale:"es-NI"},{name:"es-PA-MargaritaNeural",gender:"female",displayName:"Margarita",locale:"es-PA"},{name:"es-PA-RobertoNeural",gender:"male",displayName:"Roberto",locale:"es-PA"},{name:"es-PY-MarioNeural",gender:"male",displayName:"Mario",locale:"es-PY"},{name:"es-PY-TaniaNeural",gender:"female",displayName:"Tania",locale:"es-PY"},{name:"es-PE-AlexNeural",gender:"male",displayName:"Alex",locale:"es-PE"},{name:"es-PE-CamilaNeural",gender:"female",displayName:"Camila",locale:"es-PE"},{name:"es-PR-KarinaNeural",gender:"female",displayName:"Karina",locale:"es-PR"},{name:"es-PR-VictorNeural",gender:"male",displayName:"Víctor",locale:"es-PR"},{name:"es-US-AlonsoNeural",gender:"male",displayName:"Alonso",locale:"es-US"},{name:"es-US-PalomaNeural",gender:"female",displayName:"Paloma",locale:"es-US"},{name:"es-UY-MateoNeural",gender:"male",displayName:"Mateo",locale:"es-UY"},{name:"es-UY-ValentinaNeural",gender:"female",displayName:"Valentina",locale:"es-UY"},{name:"es-VE-PaolaNeural",gender:"female",displayName:"Paola",locale:"es-VE"},{name:"es-VE-SebastianNeural",gender:"male",displayName:"Sebastián",locale:"es-VE"},{name:"su-ID-JajangNeural",gender:"male",displayName:"Jajang",locale:"su-ID"},{name:"su-ID-TutiNeural",gender:"female",displayName:"Tuti",locale:"su-ID"},{name:"sw-KE-RafikiNeural",gender:"male",displayName:"Rafiki",locale:"sw-KE"},{name:"sw-KE-ZuriNeural",gender:"female",displayName:"Zuri",locale:"sw-KE"},{name:"sw-TZ-DaudiNeural",gender:"male",displayName:"Daudi",locale:"sw-TZ"},{name:"sw-TZ-RehemaNeural",gender:"female",displayName:"Rehema",locale:"sw-TZ"},{name:"sv-SE-MattiasNeural",gender:"male",displayName:"Mattias",locale:"sv-SE"},{name:"sv-SE-SofieNeural",gender:"female",displayName:"Sofie",locale:"sv-SE"},{name:"ta-IN-PallaviNeural",gender:"female",displayName:"பல்லவி",locale:"ta-IN"},{name:"ta-IN-ValluvarNeural",gender:"male",displayName:"வள்ளுவர்",locale:"ta-IN"},{name:"ta-MY-KaniNeural",gender:"female",displayName:"கனி",locale:"ta-MY"},{name:"ta-MY-SuryaNeural",gender:"male",displayName:"சூர்யா",locale:"ta-MY"},{name:"ta-SG-AnbuNeural",gender:"male",displayName:"அன்பு",locale:"ta-SG"},{name:"ta-SG-VenbaNeural",gender:"female",displayName:"வெண்பா",locale:"ta-SG"},{name:"ta-LK-KumarNeural",gender:"male",displayName:"குமார்",locale:"ta-LK"},{name:"ta-LK-SaranyaNeural",gender:"female",displayName:"சரண்யா",locale:"ta-LK"},{name:"te-IN-MohanNeural",gender:"male",displayName:"మోహన్",locale:"te-IN"},{name:"te-IN-ShrutiNeural",gender:"female",displayName:"శ్రుతి",locale:"te-IN"},{name:"th-TH-NiwatNeural",gender:"male",displayName:"นิวัฒน์",locale:"th-TH"},{name:"th-TH-PremwadeeNeural",gender:"female",displayName:"เปรมวดี",locale:"th-TH"},{name:"tr-TR-EmelNeural",gender:"female",displayName:"Emel",locale:"tr-TR"},{name:"tr-TR-AhmetNeural",gender:"male",displayName:"Ahmet",locale:"tr-TR"},{name:"uk-UA-OstapNeural",gender:"male",displayName:"Остап",locale:"uk-UA"},{name:"uk-UA-PolinaNeural",gender:"female",displayName:"Поліна",locale:"uk-UA"},{name:"ur-IN-GulNeural",gender:"female",displayName:"گل",locale:"ur-IN"},{name:"ur-IN-SalmanNeural",gender:"male",displayName:"سلمان",locale:"ur-IN"},{name:"ur-PK-AsadNeural",gender:"male",displayName:"اسد",locale:"ur-PK"},{name:"ur-PK-UzmaNeural",gender:"female",displayName:"عظمیٰ",locale:"ur-PK"},{name:"uz-UZ-MadinaNeural",gender:"female",displayName:"Madina",locale:"uz-UZ"},{name:"uz-UZ-SardorNeural",gender:"male",displayName:"Sardor",locale:"uz-UZ"},{name:"vi-VN-HoaiMyNeural",gender:"female",displayName:"Hoài My",locale:"vi-VN"},{name:"vi-VN-NamMinhNeural",gender:"male",displayName:"Nam Minh",locale:"vi-VN"},{name:"cy-GB-AledNeural",gender:"male",displayName:"Aled",locale:"cy-GB"},{name:"cy-GB-NiaNeural",gender:"female",displayName:"Nia",locale:"cy-GB"},{name:"zu-ZA-ThandoNeural",gender:"female",displayName:"Thando",locale:"zu-ZA"},{name:"zu-ZA-ThembaNeural",gender:"male",displayName:"Themba",locale:"zu-ZA"},{name:"as-IN-YashicaNeural",gender:"female",displayName:"যাশিকা",locale:"as-IN"},{name:"as-IN-PriyomNeural",gender:"male",displayName:"প্ৰিয়ম",locale:"as-IN"},{name:"ca-ES-AlbaNeural",gender:"female",displayName:"Alba",locale:"ca-ES"},{name:"de-DE-ChristophNeural",gender:"male",displayName:"Christoph",locale:"de-DE"},{name:"de-DE-ElkeNeural",gender:"female",displayName:"Elke",locale:"de-DE"},{name:"de-DE-GiselaNeural",gender:"female",displayName:"Gisela",locale:"de-DE"},{name:"de-DE-KasperNeural",gender:"male",displayName:"Kasper",locale:"de-DE"},{name:"de-DE-KlarissaNeural",gender:"female",displayName:"Klarissa",locale:"de-DE"},{name:"de-DE-KlausNeural",gender:"male",displayName:"Klaus",locale:"de-DE"},{name:"de-DE-LouisaNeural",gender:"female",displayName:"Louisa",locale:"de-DE"},{name:"de-DE-MajaNeural",gender:"female",displayName:"Maja",locale:"de-DE"},{name:"de-DE-RalfNeural",gender:"male",displayName:"Ralf",locale:"de-DE"},{name:"de-DE-TanjaNeural",gender:"female",displayName:"Tanja",locale:"de-DE"},{name:"en-AU-WilliamNeural",gender:"male",displayName:"William",locale:"en-AU"},{name:"en-AU-AnnetteNeural",gender:"female",displayName:"Annette",locale:"en-AU"},{name:"en-AU-CarlyNeural",gender:"female",displayName:"Carly",locale:"en-AU"},{name:"en-AU-DarrenNeural",gender:"male",displayName:"Darren",locale:"en-AU"},{name:"en-AU-DuncanNeural",gender:"male",displayName:"Duncan",locale:"en-AU"},{name:"en-AU-ElsieNeural",gender:"female",displayName:"Elsie",locale:"en-AU"},{name:"en-AU-FreyaNeural",gender:"female",displayName:"Freya",locale:"en-AU"},{name:"en-AU-JoanneNeural",gender:"female",displayName:"Joanne",locale:"en-AU"},{name:"en-AU-KenNeural",gender:"male",displayName:"Ken",locale:"en-AU"},{name:"en-AU-KimNeural",gender:"female",displayName:"Kim",locale:"en-AU"},{name:"en-AU-NeilNeural",gender:"male",displayName:"Neil",locale:"en-AU"},{name:"en-AU-TimNeural",gender:"male",displayName:"Tim",locale:"en-AU"},{name:"en-AU-TinaNeural",gender:"female",displayName:"Tina",locale:"en-AU"},{name:"en-GB-AdaMultilingualNeural",gender:"female",displayName:"Ada Multilingual",locale:"en-GB"},{name:"en-GB-OllieMultilingualNeural",gender:"male",displayName:"Ollie Multilingual",locale:"en-GB"},{name:"en-GB-AbbiNeural",gender:"female",displayName:"Abbi",locale:"en-GB"},{name:"en-GB-AlfieNeural",gender:"male",displayName:"Alfie",locale:"en-GB"},{name:"en-GB-BellaNeural",gender:"female",displayName:"Bella",locale:"en-GB"},{name:"en-GB-ElliotNeural",gender:"male",displayName:"Elliot",locale:"en-GB"},{name:"en-GB-EthanNeural",gender:"male",displayName:"Ethan",locale:"en-GB"},{name:"en-GB-HollieNeural",gender:"female",displayName:"Hollie",locale:"en-GB"},{name:"en-GB-NoahNeural",gender:"male",displayName:"Noah",locale:"en-GB"},{name:"en-GB-OliverNeural",gender:"male",displayName:"Oliver",locale:"en-GB"},{name:"en-GB-OliviaNeural",gender:"female",displayName:"Olivia",locale:"en-GB"},{name:"en-GB-MiaNeural",gender:"female",displayName:"Mia",locale:"en-GB"},{name:"en-IN-AartiIndicNeural",gender:"female",displayName:"Aarti Indic",locale:"en-IN"},{name:"en-IN-ArjunIndicNeural",gender:"male",displayName:"Arjun Indic",locale:"en-IN"},{name:"en-IN-NeerjaIndicNeural",gender:"female",displayName:"Neerja Indic",locale:"en-IN"},{name:"en-IN-PrabhatIndicNeural",gender:"male",displayName:"Prabhat Indic",locale:"en-IN"},{name:"en-IN-AaravNeural",gender:"male",displayName:"Aarav",locale:"en-IN"},{name:"en-IN-AashiNeural",gender:"female",displayName:"Aashi",locale:"en-IN"},{name:"en-IN-AartiNeural",gender:"female",displayName:"Aarti",locale:"en-IN"},{name:"en-IN-ArjunNeural",gender:"male",displayName:"Arjun",locale:"en-IN"},{name:"en-IN-AnanyaNeural",gender:"female",displayName:"Ananya",locale:"en-IN"},{name:"en-IN-KavyaNeural",gender:"female",displayName:"Kavya",locale:"en-IN"},{name:"en-IN-KunalNeural",gender:"male",displayName:"Kunal",locale:"en-IN"},{name:"en-IN-RehaanNeural",gender:"male",displayName:"Rehaan",locale:"en-IN"},{name:"en-US-AmandaMultilingualNeural",gender:"female",displayName:"Amanda Multilingual",locale:"en-US"},{name:"en-US-AdamMultilingualNeural",gender:"male",displayName:"Adam Multilingual",locale:"en-US"},{name:"en-US-PhoebeMultilingualNeural",gender:"female",displayName:"Phoebe Multilingual",locale:"en-US"},{name:"en-US-AlloyTurboMultilingualNeural",gender:"male",displayName:"Alloy Turbo Multilingual",locale:"en-US"},{name:"en-US-EchoTurboMultilingualNeural",gender:"male",displayName:"Echo Turbo Multilingual",locale:"en-US"},{name:"en-US-FableTurboMultilingualNeural",gender:"female",displayName:"Fable Turbo Multilingual",locale:"en-US"},{name:"en-US-OnyxTurboMultilingualNeural",gender:"male",displayName:"Onyx Turbo Multilingual",locale:"en-US"},{name:"en-US-NovaTurboMultilingualNeural",gender:"female",displayName:"Nova Turbo Multilingual",locale:"en-US"},{name:"en-US-ShimmerTurboMultilingualNeural",gender:"female",displayName:"Shimmer Turbo Multilingual",locale:"en-US"},{name:"en-US-JasonNeural",gender:"male",displayName:"Jason",locale:"en-US"},{name:"en-US-KaiNeural",gender:"male",displayName:"Kai",locale:"en-US"},{name:"en-US-LunaNeural",gender:"female",displayName:"Luna",locale:"en-US"},{name:"en-US-TonyNeural",gender:"male",displayName:"Tony",locale:"en-US"},{name:"en-US-NancyNeural",gender:"female",displayName:"Nancy",locale:"en-US"},{name:"en-US-CoraMultilingualNeural",gender:"female",displayName:"Cora Multilingual",locale:"en-US"},{name:"en-US-ChristopherMultilingualNeural",gender:"male",displayName:"Christopher Multilingual",locale:"en-US"},{name:"en-US-BrandonMultilingualNeural",gender:"male",displayName:"Brandon Multilingual",locale:"en-US"},{name:"en-US-AshleyNeural",gender:"female",displayName:"Ashley",locale:"en-US"},{name:"en-US-BrandonNeural",gender:"male",displayName:"Brandon",locale:"en-US"},{name:"en-US-CoraNeural",gender:"female",displayName:"Cora",locale:"en-US"},{name:"en-US-DavisMultilingualNeural",gender:"male",displayName:"Davis Multilingual",locale:"en-US"},{name:"en-US-DerekMultilingualNeural",gender:"male",displayName:"Derek Multilingual",locale:"en-US"},{name:"en-US-DustinMultilingualNeural",gender:"male",displayName:"Dustin Multilingual",locale:"en-US"},{name:"en-US-ElizabethNeural",gender:"female",displayName:"Elizabeth",locale:"en-US"},{name:"en-US-JacobNeural",gender:"male",displayName:"Jacob",locale:"en-US"},{name:"en-US-JennyMultilingualNeural",gender:"female",displayName:"Jenny Multilingual",locale:"en-US"},{name:"en-US-LewisMultilingualNeural",gender:"male",displayName:"Lewis Multilingual",locale:"en-US"},{name:"en-US-LolaMultilingualNeural",gender:"female",displayName:"Lola Multilingual",locale:"en-US"},{name:"en-US-MonicaNeural",gender:"female",displayName:"Monica",locale:"en-US"},{name:"en-US-NancyMultilingualNeural",gender:"female",displayName:"Nancy Multilingual",locale:"en-US"},{name:"en-US-RyanMultilingualNeural",gender:"male",displayName:"Ryan Multilingual",locale:"en-US"},{name:"en-US-SamuelMultilingualNeural",gender:"male",displayName:"Samuel Multilingual",locale:"en-US"},{name:"en-US-SerenaMultilingualNeural",gender:"female",displayName:"Serena Multilingual",locale:"en-US"},{name:"en-US-SteffanMultilingualNeural",gender:"male",displayName:"Steffan Multilingual",locale:"en-US"},{name:"en-US-AIGenerate1Neural",gender:"male",displayName:"AIGenerate1",locale:"en-US"},{name:"en-US-AIGenerate2Neural",gender:"female",displayName:"AIGenerate2",locale:"en-US"},{name:"en-US-AshTurboMultilingualNeural",gender:"male",displayName:"Ash Turbo Multilingual",locale:"en-US"},{name:"en-US-BlueNeural",gender:"female",displayName:"Blue",locale:"en-US"},{name:"en-US-EvelynMultilingualNeural",gender:"female",displayName:"Evelyn Multilingual",locale:"en-US"},{name:"es-ES-ArabellaMultilingualNeural",gender:"female",displayName:"Arabella Multilingual",locale:"es-ES"},{name:"es-ES-IsidoraMultilingualNeural",gender:"female",displayName:"Isidora Multilingual",locale:"es-ES"},{name:"es-ES-TristanMultilingualNeural",gender:"male",displayName:"Tristan Multilingual",locale:"es-ES"},{name:"es-ES-XimenaMultilingualNeural",gender:"female",displayName:"Ximena Multilingual",locale:"es-ES"},{name:"es-ES-DarioNeural",gender:"male",displayName:"Dario",locale:"es-ES"},{name:"es-ES-EliasNeural",gender:"male",displayName:"Elias",locale:"es-ES"},{name:"es-ES-EstrellaNeural",gender:"female",displayName:"Estrella",locale:"es-ES"},{name:"es-ES-IreneNeural",gender:"female",displayName:"Irene",locale:"es-ES"},{name:"es-ES-LaiaNeural",gender:"female",displayName:"Laia",locale:"es-ES"},{name:"es-ES-LiaNeural",gender:"female",displayName:"Lia",locale:"es-ES"},{name:"es-ES-NilNeural",gender:"male",displayName:"Nil",locale:"es-ES"},{name:"es-ES-SaulNeural",gender:"male",displayName:"Saul",locale:"es-ES"},{name:"es-ES-TeoNeural",gender:"male",displayName:"Teo",locale:"es-ES"},{name:"es-ES-TrianaNeural",gender:"female",displayName:"Triana",locale:"es-ES"},{name:"es-ES-VeraNeural",gender:"female",displayName:"Vera",locale:"es-ES"},{name:"es-MX-DaliaMultilingualNeural",gender:"female",displayName:"Dalia Multilingual",locale:"es-MX"},{name:"es-MX-JorgeMultilingualNeural",gender:"male",displayName:"Jorge Multilingual",locale:"es-MX"},{name:"es-MX-BeatrizNeural",gender:"female",displayName:"Beatriz",locale:"es-MX"},{name:"es-MX-CandelaNeural",gender:"female",displayName:"Candela",locale:"es-MX"},{name:"es-MX-CarlotaNeural",gender:"female",displayName:"Carlota",locale:"es-MX"},{name:"es-MX-CecilioNeural",gender:"male",displayName:"Cecilio",locale:"es-MX"},{name:"es-MX-GerardoNeural",gender:"male",displayName:"Gerardo",locale:"es-MX"},{name:"es-MX-LarissaNeural",gender:"female",displayName:"Larissa",locale:"es-MX"},{name:"es-MX-LibertoNeural",gender:"male",displayName:"Liberto",locale:"es-MX"},{name:"es-MX-LucianoNeural",gender:"male",displayName:"Luciano",locale:"es-MX"},{name:"es-MX-MarinaNeural",gender:"female",displayName:"Marina",locale:"es-MX"},{name:"es-MX-NuriaNeural",gender:"female",displayName:"Nuria",locale:"es-MX"},{name:"es-MX-PelayoNeural",gender:"male",displayName:"Pelayo",locale:"es-MX"},{name:"es-MX-RenataNeural",gender:"female",displayName:"Renata",locale:"es-MX"},{name:"es-MX-YagoNeural",gender:"male",displayName:"Yago",locale:"es-MX"},{name:"eu-ES-AinhoaNeural",gender:"female",displayName:"Ainhoa",locale:"eu-ES"},{name:"eu-ES-AnderNeural",gender:"male",displayName:"Ander",locale:"eu-ES"},{name:"fi-FI-SelmaNeural",gender:"female",displayName:"Selma",locale:"fi-FI"},{name:"fr-FR-LucienMultilingualNeural",gender:"male",displayName:"Lucien Multilingual",locale:"fr-FR"},{name:"fr-FR-AlainNeural",gender:"male",displayName:"Alain",locale:"fr-FR"},{name:"fr-FR-BrigitteNeural",gender:"female",displayName:"Brigitte",locale:"fr-FR"},{name:"fr-FR-CelesteNeural",gender:"female",displayName:"Celeste",locale:"fr-FR"},{name:"fr-FR-ClaudeNeural",gender:"male",displayName:"Claude",locale:"fr-FR"},{name:"fr-FR-CoralieNeural",gender:"female",displayName:"Coralie",locale:"fr-FR"},{name:"fr-FR-JacquelineNeural",gender:"female",displayName:"Jacqueline",locale:"fr-FR"},{name:"fr-FR-JeromeNeural",gender:"male",displayName:"Jerome",locale:"fr-FR"},{name:"fr-FR-JosephineNeural",gender:"female",displayName:"Josephine",locale:"fr-FR"},{name:"fr-FR-MauriceNeural",gender:"male",displayName:"Maurice",locale:"fr-FR"},{name:"fr-FR-YvesNeural",gender:"male",displayName:"Yves",locale:"fr-FR"},{name:"fr-FR-YvetteNeural",gender:"female",displayName:"Yvette",locale:"fr-FR"},{name:"hi-IN-AaravNeural",gender:"male",displayName:"आरव ",locale:"hi-IN"},{name:"hi-IN-AnanyaNeural",gender:"female",displayName:"अनन्या",locale:"hi-IN"},{name:"hi-IN-AartiNeural",gender:"female",displayName:"आरती",locale:"hi-IN"},{name:"hi-IN-ArjunNeural",gender:"male",displayName:"अर्जुन",locale:"hi-IN"},{name:"hi-IN-KavyaNeural",gender:"female",displayName:"काव्या",locale:"hi-IN"},{name:"hi-IN-KunalNeural",gender:"male",displayName:"कुनाल ",locale:"hi-IN"},{name:"hi-IN-RehaanNeural",gender:"male",displayName:"रेहान",locale:"hi-IN"},{name:"hy-AM-AnahitNeural",gender:"female",displayName:"Անահիտ",locale:"hy-AM"},{name:"hy-AM-HaykNeural",gender:"male",displayName:"Հայկ",locale:"hy-AM"},{name:"it-IT-AlessioMultilingualNeural",gender:"male",displayName:"Alessio Multilingual",locale:"it-IT"},{name:"it-IT-IsabellaMultilingualNeural",gender:"female",displayName:"Isabella Multilingual",locale:"it-IT"},{name:"it-IT-MarcelloMultilingualNeural",gender:"male",displayName:"Marcello Multilingual",locale:"it-IT"},{name:"it-IT-CalimeroNeural",gender:"male",displayName:"Calimero",locale:"it-IT"},{name:"it-IT-CataldoNeural",gender:"male",displayName:"Cataldo",locale:"it-IT"},{name:"it-IT-FabiolaNeural",gender:"female",displayName:"Fabiola",locale:"it-IT"},{name:"it-IT-FiammaNeural",gender:"female",displayName:"Fiamma",locale:"it-IT"},{name:"it-IT-GianniNeural",gender:"male",displayName:"Gianni",locale:"it-IT"},{name:"it-IT-GiuseppeNeural",gender:"male",displayName:"Giuseppe",locale:"it-IT"},{name:"it-IT-ImeldaNeural",gender:"female",displayName:"Imelda",locale:"it-IT"},{name:"it-IT-IrmaNeural",gender:"female",displayName:"Irma",locale:"it-IT"},{name:"it-IT-LisandroNeural",gender:"male",displayName:"Lisandro",locale:"it-IT"},{name:"it-IT-PalmiraNeural",gender:"female",displayName:"Palmira",locale:"it-IT"},{name:"it-IT-PierinaNeural",gender:"female",displayName:"Pierina",locale:"it-IT"},{name:"it-IT-RinaldoNeural",gender:"male",displayName:"Rinaldo",locale:"it-IT"},{name:"ja-JP-AoiNeural",gender:"female",displayName:"碧衣",locale:"ja-JP"},{name:"ja-JP-DaichiNeural",gender:"male",displayName:"大智",locale:"ja-JP"},{name:"ja-JP-MayuNeural",gender:"female",displayName:"真夕",locale:"ja-JP"},{name:"ja-JP-NaokiNeural",gender:"male",displayName:"直紀",locale:"ja-JP"},{name:"ja-JP-ShioriNeural",gender:"female",displayName:"志織",locale:"ja-JP"},{name:"ja-JP-MasaruMultilingualNeural",gender:"male",displayName:"勝 多言語",locale:"ja-JP"},{name:"ko-KR-BongJinNeural",gender:"male",displayName:"봉진",locale:"ko-KR"},{name:"ko-KR-GookMinNeural",gender:"male",displayName:"국민",locale:"ko-KR"},{name:"ko-KR-HyunsuNeural",gender:"male",displayName:"현수",locale:"ko-KR"},{name:"ko-KR-JiMinNeural",gender:"female",displayName:"지민",locale:"ko-KR"},{name:"ko-KR-SeoHyeonNeural",gender:"female",displayName:"서현",locale:"ko-KR"},{name:"ko-KR-YuJinNeural",gender:"female",displayName:"유진",locale:"ko-KR"},{name:"nb-NO-IselinNeural",gender:"female",displayName:"Iselin",locale:"nb-NO"},{name:"or-IN-SubhasiniNeural",gender:"female",displayName:"ସୁଭାସିନୀ",locale:"or-IN"},{name:"or-IN-SukantNeural",gender:"male",displayName:"ସୁକାନ୍ତ",locale:"or-IN"},{name:"pa-IN-OjasNeural",gender:"male",displayName:"ਓਜਸ",locale:"pa-IN"},{name:"pa-IN-VaaniNeural",gender:"female",displayName:"ਵਾਨੀ",locale:"pa-IN"},{name:"pl-PL-AgnieszkaNeural",gender:"female",displayName:"Agnieszka",locale:"pl-PL"},{name:"pt-BR-MacerioMultilingualNeural",gender:"male",displayName:"Macerio Multilingual",locale:"pt-BR"},{name:"pt-BR-BrendaNeural",gender:"female",displayName:"Brenda",locale:"pt-BR"},{name:"pt-BR-DonatoNeural",gender:"male",displayName:"Donato",locale:"pt-BR"},{name:"pt-BR-ElzaNeural",gender:"female",displayName:"Elza",locale:"pt-BR"},{name:"pt-BR-FabioNeural",gender:"male",displayName:"Fabio",locale:"pt-BR"},{name:"pt-BR-GiovannaNeural",gender:"female",displayName:"Giovanna",locale:"pt-BR"},{name:"pt-BR-HumbertoNeural",gender:"male",displayName:"Humberto",locale:"pt-BR"},{name:"pt-BR-JulioNeural",gender:"male",displayName:"Julio",locale:"pt-BR"},{name:"pt-BR-LeilaNeural",gender:"female",displayName:"Leila",locale:"pt-BR"},{name:"pt-BR-LeticiaNeural",gender:"female",displayName:"Leticia",locale:"pt-BR"},{name:"pt-BR-ManuelaNeural",gender:"female",displayName:"Manuela",locale:"pt-BR"},{name:"pt-BR-NicolauNeural",gender:"male",displayName:"Nicolau",locale:"pt-BR"},{name:"pt-BR-ThalitaNeural",gender:"female",displayName:"Thalita",locale:"pt-BR"},{name:"pt-BR-ValerioNeural",gender:"male",displayName:"Valerio",locale:"pt-BR"},{name:"pt-BR-YaraNeural",gender:"female",displayName:"Yara",locale:"pt-BR"},{name:"pt-PT-FernandaNeural",gender:"female",displayName:"Fernanda",locale:"pt-PT"},{name:"sr-Latn-RS-NicholasNeural",gender:"male",displayName:"Nicholas",locale:"sr-Latn-RS"},{name:"sr-Latn-RS-SophieNeural",gender:"female",displayName:"Sophie",locale:"sr-Latn-RS"},{name:"sv-SE-HilleviNeural",gender:"female",displayName:"Hillevi",locale:"sv-SE"},{name:"th-TH-AcharaNeural",gender:"female",displayName:"อัจฉรา",locale:"th-TH"},{name:"wuu-CN-XiaotongNeural",gender:"female",displayName:"晓彤",locale:"wuu-CN"},{name:"wuu-CN-YunzheNeural",gender:"male",displayName:"云哲",locale:"wuu-CN"},{name:"zh-CN-XiaochenNeural",gender:"female",displayName:"晓辰",locale:"zh-CN"},{name:"zh-CN-XiaochenMultilingualNeural",gender:"female",displayName:"晓辰 多语言",locale:"zh-CN"},{name:"zh-CN-XiaohanNeural",gender:"female",displayName:"晓涵",locale:"zh-CN"},{name:"zh-CN-XiaomengNeural",gender:"female",displayName:"晓梦",locale:"zh-CN"},{name:"zh-CN-XiaomoNeural",gender:"female",displayName:"晓墨",locale:"zh-CN"},{name:"zh-CN-XiaoqiuNeural",gender:"female",displayName:"晓秋",locale:"zh-CN"},{name:"zh-CN-XiaorouNeural",gender:"female",displayName:"晓柔",locale:"zh-CN"},{name:"zh-CN-XiaoruiNeural",gender:"female",displayName:"晓睿",locale:"zh-CN"},{name:"zh-CN-XiaoshuangNeural",gender:"female",displayName:"晓双",locale:"zh-CN"},{name:"zh-CN-XiaoxiaoDialectsNeural",gender:"female",displayName:"晓晓 ",locale:"zh-CN"},{name:"zh-CN-XiaoxiaoMultilingualNeural",gender:"female",displayName:"晓晓 多语言",locale:"zh-CN"},{name:"zh-CN-XiaoyanNeural",gender:"female",displayName:"晓颜",locale:"zh-CN"},{name:"zh-CN-XiaoyouNeural",gender:"female",displayName:"晓悠",locale:"zh-CN"},{name:"zh-CN-XiaoyuMultilingualNeural",gender:"female",displayName:"晓宇 多语言",locale:"zh-CN"},{name:"zh-CN-XiaozhenNeural",gender:"female",displayName:"晓甄",locale:"zh-CN"},{name:"zh-CN-YunfengNeural",gender:"male",displayName:"云枫",locale:"zh-CN"},{name:"zh-CN-YunhaoNeural",gender:"male",displayName:"云皓",locale:"zh-CN"},{name:"zh-CN-YunjieNeural",gender:"male",displayName:"云杰",locale:"zh-CN"},{name:"zh-CN-YunxiaoMultilingualNeural",gender:"male",displayName:"云霄 多语言",locale:"zh-CN"},{name:"zh-CN-YunyeNeural",gender:"male",displayName:"云野",locale:"zh-CN"},{name:"zh-CN-YunyiMultilingualNeural",gender:"male",displayName:"云逸 多语言",locale:"zh-CN"},{name:"zh-CN-YunzeNeural",gender:"male",displayName:"云泽",locale:"zh-CN"},{name:"zh-CN-YunfanMultilingualNeural",gender:"male",displayName:"云帆 多语言",locale:"zh-CN"},{name:"zh-CN-guangxi-YunqiNeural",gender:"male",displayName:"云奇 广西",locale:"zh-CN"},{name:"zh-CN-henan-YundengNeural",gender:"male",displayName:"云登 河南",locale:"zh-CN"},{name:"zh-CN-liaoning-YunbiaoNeural",gender:"male",displayName:"云彪 辽宁",locale:"zh-CN"},{name:"zh-CN-shandong-YunxiangNeural",gender:"male",displayName:"云翔 山东",locale:"zh-CN"},{name:"zh-CN-sichuan-YunxiNeural",gender:"male",displayName:"云希 四川",locale:"zh-CN"}],SelfHostedVoiceList:["de-DE-AmalaNeural","de-DE-BerndNeural","de-DE-ConradNeural","de-DE-KatjaNeural","en-GB-LibbyNeural","en-GB-RyanNeural","en-GB-SoniaNeural","en-US-AmberNeural","en-US-AriaNeural","en-US-ChristopherNeural","en-US-DavisNeural","en-US-EricNeural","en-US-GuyNeural","en-US-JaneNeural","en-US-JennyNeural","en-US-MichelleNeural","en-US-SaraNeural","es-ES-AbrilNeural","es-ES-AlvaroNeural","es-ES-ArnauNeural","es-ES-ElviraNeural","fr-FR-DeniseNeural","fr-FR-HenriNeural","it-IT-BenignoNeural","it-IT-DiegoNeural","it-IT-ElsaNeural","it-IT-IsabellaNeural","ja-JP-KeitaNeural","ja-JP-NanamiNeural","ko-KR-InJoonNeural","ko-KR-SoonBokNeural","ko-KR-SunHiNeural","pt-BR-AntonioNeural","pt-BR-FranciscaNeural","pt-PT-DuarteNeural","pt-PT-RaquelNeural","ru-RU-DariyaNeural","ru-RU-DmitryNeural","ru-RU-SvetlanaNeural","yue-CN-XiaoMinNeural","yue-CN-YunSongNeural","zh-CN-henan-YundengNeural","zh-CN-liaoning-XiaobeiNeural","zh-CN-shaanxi-XiaoniNeural","zh-CN-shandong-YunxiangNeural","zh-CN-sichuan-YunxiNeural","zh-CN-XiaoxiaoNeural","zh-CN-YunxiNeural","zh-HK-HiuMaanNeural","zh-HK-WanLungNeural","zh-TW-HsiaoChenNeural","zh-TW-YunJheNeural","zf_xiaoxiao","zm_yunxi","zf_xiaoni","zf_xiaobei"],CloudDictList:[{id:"basic-english-irish",name:"Basic English-Irish Dictionary",translation:"简明英爱词典",source:"Pat Griffin"},{id:"english-italian",name:"English-Italian Dictionary",translation:"简明英意词典",source:"Pat Griffin"},{id:"cc-cedict",name:"CC-CEDICT",translation:"简明中英词典",source:"www.mdbg.net"},{id:"et-tedict",name:"ET-TEDICT",translation:"简明中英英中词典",source:"cdict-1.0-1.i386.rpm"},{id:"jmdict",name:"Japanese English Dictionary",translation:"简明日英词典",source:"JMDict"},{id:"moby",name:"Moby Thesaurus",translation:"Moby Thesaurus",source:"Chua Welic"},{id:"wordnet",name:"Wordnet",translation:"Wordnet",source:"Chua Welic"},{id:"opted",name:"Online Plain Text English Dictionary",translation:"简明英英词典",source:"Chua Welic"},{id:"english-arabic",name:"English-Arabic Dictionary",translation:"简明英阿词典",source:"Khaldoun Mahmoud"},{id:"tcm_textbook",name:"中医教材仓库",translation:"中医教材仓库",source:"Fredrik Jornebo"},{id:"ecdict",name:"ECDICT",translation:"简明英汉字典增强版",source:"GitHub-skywind3000"}]};class x{constructor(e){this.config=e,this.driveId="",this.taskQueue=new k(1),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getDriveId(){return m(this,void 0,void 0,(function*(){if(this.driveId)return this.driveId;const a=this.config.access_token,t=yield e.post("https://openapi.alipan.com/adrive/v1.0/user/getDriveInfo",{},{headers:{Authorization:`Bearer ${a}`}});return this.driveId=t.data.default_drive_id,this.driveId}))}getFolderIdByPath(a){return m(this,void 0,void 0,(function*(){const t=this.config.access_token,o=yield this.getDriveId();try{try{const i=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(i.data)return i.data.file_id}catch(i){const n=a.split("/").filter((e=>e));let r="",l="root";for(const a of n){r+="/"+a;try{l=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:r},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id}catch(i){l=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:o,parent_file_id:l,name:a,type:"folder",check_name_mode:"refuse"},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id}}return l}}catch(e){return console.error("Error getting/creating folder by path:",e),""}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=yield this.getDriveId(),i=yield this.getFolderIdByPath(this.baseFolder+"/"+a);let n=[],r="",l=!0;for(;l;){const a=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/list",{drive_id:o,parent_file_id:i,marker:r||void 0},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}),s=a.data.items.filter((e=>!e.punish_flag||2!==e.punish_flag))||[];n=n.concat(s),r=a.data.next_marker,l=!!r}return[...new Set(n.map((e=>({name:e.name,size:e.size,type:e.type,modified:e.updated_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=yield this.getDriveId(),i=yield this.getFolderIdByPath(this.baseFolder+"/"+a);return!i||(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/delete",{drive_id:o,file_id:i},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}checkExists(a){var t;return m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=yield this.getDriveId(),n=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:i,file_path:a},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}});(null===(t=n.data)||void 0===t?void 0:t.file_id)&&(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/recyclebin/trash",{drive_id:i,file_id:n.data.file_id},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}))}catch(e){}}))}getAuthUrl(e){return`https://openapi.alipan.com/oauth/authorize?${new URLSearchParams({response_type:"code",client_id:C.adriveClientId,redirect_uri:e,grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}).toString()}`}}class I extends x{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=yield this.getDriveId(),n=t.substring(0,t.lastIndexOf("/")),r=t.substring(t.lastIndexOf("/")+1);yield this.deleteFileWithoutQueue(t);const l=yield this.getFolderIdByPath(this.baseFolder+"/"+n),s=yield a.arrayBuffer(),d=s.byteLength,c=yield crypto.subtle.digest("SHA-1",s),u=Array.from(new Uint8Array(c)).map((e=>e.toString(16).padStart(2,"0"))).join(""),m=(e=>{function a(e,a){const t=(65535&e)+(65535&a);return(e>>16)+(a>>16)+(t>>16)<<16|65535&t}function t(e,t,o,i,n,r){return a((l=a(a(t,e),a(i,r)))<<(s=n)|l>>>32-s,o);var l,s}function o(e,a,o,i,n,r,l){return t(a&o|~a&i,e,a,n,r,l)}function i(e,a,o,i,n,r,l){return t(a&i|o&~i,e,a,n,r,l)}function n(e,a,o,i,n,r,l){return t(a^o^i,e,a,n,r,l)}function r(e,a,o,i,n,r,l){return t(o^(a|~i),e,a,n,r,l)}const l=function(e){const a=e.length,t=1+(a+8>>6),o=new Array(16*t).fill(0);for(let t=0;t>2]|=e.charCodeAt(t)<>2]|=128<{let a="";for(let t=0;t<4;t++)a+=("0"+(e>>8*t&255).toString(16)).slice(-2);return a})).join("")})(o),p=Number(BigInt("0x"+m.slice(0,16))%BigInt(d||1)),h=new Uint8Array(s.slice(p,Math.min(p+8,d))),g=btoa(String.fromCharCode(...h)),f=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:i,parent_file_id:l,name:r,type:"file",check_name_mode:"ignore",size:d,content_hash:u,content_hash_name:"sha1",proof_code:g,proof_version:"v1",part_info_list:[{part_number:1}]},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}),{file_id:y,upload_id:N,rapid_upload:v,part_info_list:b}=f.data;return v?(console.info("阿里云盘秒传成功"),!0):(yield fetch(b[0].upload_url,{method:"PUT",body:s,headers:{"Content-Length":d.toString()}}),yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/complete",{drive_id:i,file_id:y,upload_id:N},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=yield this.getDriveId(),i=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:this.baseFolder+"/"+a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id,n=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/getDownloadUrl",{drive_id:o,file_id:i},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return(yield e.get(n.data.url,{responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}})).data}catch(e){return console.error("Error downloading file:",e),!1}}))))))}}class F{constructor(e){this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getFolderIdByPath(a){return m(this,void 0,void 0,(function*(){if(""==a)return"0";const t=this.config.access_token,o=a.split("/");let i="0";for(const a of o){const o=`https://api.box.com/2.0/folders/${i}/items?fields=id,name&type=folder&limit=1000`;try{const n=(yield e.get(o,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===a&&"folder"===e.type));if(n)i=n.id;else{const o={name:a,parent:{id:i},type:"folder"};i=(yield e.post("https://api.box.com/2.0/folders",o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.id}}catch(e){return console.error("Error occurred during folder creation:",e),""}}return i}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);let i=yield this.getFolderIdByPath(o),n=[],r=0,l=!0;const s=1e3;for(;l;){const a=yield e.get(`https://api.box.com/2.0/folders/${i}/items`,{params:{limit:s,offset:r},headers:{Authorization:`Bearer ${t}`}}),o=a.data.entries||[];n=n.concat(o),r+=o.length,l=o.length===s&&a.data.total_count>r}return[...new Set(n.map((e=>({name:e.name,size:e.size||0,type:e.type,modified:e.content_modified_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=a.substring(0,a.lastIndexOf("/")),i=a.substring(a.lastIndexOf("/")+1);let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const r=yield this.getFolderIdByPath(n);if(!r)return!0;const l=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=file&limit=1000`,s=(yield e.get(l,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===i&&"file"===e.type));return!s||(yield e.delete(`https://api.box.com/2.0/files/${s.id}`,{headers:{Authorization:`Bearer ${t}`}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://account.box.com/api/oauth2/authorize?${new URLSearchParams({response_type:"code",client_id:C.boxClientId,redirect_uri:e,grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}).toString()}`}}class R extends F{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=t.substring(0,t.lastIndexOf("/")),n=t.substring(t.lastIndexOf("/")+1);let r=this.baseFolder+"/"+i;for(;r.startsWith("/");)r=r.substring(1);const l=yield this.getFolderIdByPath(r);if(!l)throw new Error("Folder not found");const s=(yield this.listFiles(i)).find((e=>e===n));s&&(yield this.deleteFileWithoutQueue(i+"/"+n));let d=new File([a],n,{lastModified:(new Date).getTime(),type:a.type});const c=new FormData;c.append("file",d),c.append("parent_id",l);const u=yield e.post("https://upload.box.com/api/2.0/files/content",c,{headers:{Authorization:`Bearer ${o}`,"Content-Type":"multipart/form-data"},params:{if_match:"false",fields:"name,id"},maxContentLength:1/0,maxBodyLength:1/0});return!(u.status>=300)||(console.error("Error occurred during file upload:",u),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=a.substring(0,a.lastIndexOf("/")),i=a.substring(a.lastIndexOf("/")+1);let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const r=yield this.getFolderIdByPath(n);if(!r)return console.error("Folder not found"),!0;const l=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=file&limit=1000`,s=(yield e.get(l,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===i&&"file"===e.type));if(!s)return console.error("File not found:",i),!0;const d=yield e({url:`https://api.box.com/2.0/files/${s.id}/content`,method:"get",headers:{Authorization:`Bearer ${t}`},responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return d.status>=300?(console.error("Error occurred during file download:",d),!1):d.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class O{constructor(e){this.config=e,this.taskQueue=new k(3)}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=[],i=!0,n=null;for(;i;){let r;r=n?yield e.post("https://api.dropboxapi.com/2/files/list_folder/continue",{cursor:n},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}):yield e.post("https://api.dropboxapi.com/2/files/list_folder",{path:"/"+a,limit:2e3},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});const l=r.data.entries||[];o=o.concat(l),i=r.data.has_more,n=r.data.cursor}return[...new Set(o.map((e=>({name:e.name,size:e.size||0,type:e[".tag"],modified:e.client_modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;yield e.post("https://api.dropboxapi.com/2/files/delete_v2",{path:"/"+a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://www.dropbox.com/oauth2/authorize?response_type=code&token_access_type=offline&client_id=${C.dropboxClientId}&redirect_uri=${e}`}}class _ extends O{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type});const r=yield e.post("https://content.dropboxapi.com/2/files/upload",n,{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/octet-stream","Dropbox-API-Arg":JSON.stringify({path:"/"+t,mode:"overwrite",autorename:!0,mute:!1})},maxContentLength:1/0,maxBodyLength:1/0});return!(r.status>=300)||(console.error("Error occurred during file upload:",r),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=yield e({url:"https://content.dropboxapi.com/2/files/download",method:"post",headers:{Authorization:`Bearer ${t}`,"Dropbox-API-Arg":JSON.stringify({path:"/"+a})},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return o.status>=300?(console.error("Error occurred during file download:",o),!1):o.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ${constructor(e){this.folderExistsCache=new Set,this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){var t,o;return m(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);let n=[],r=0;const l=1e3;let s=!0;for(;s;){const d=yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:a?`/${a}`:"/",limit:l,offset:r,fields:"_embedded.items.name,_embedded.items.size,_embedded.items.type,_embedded.items.modified,_embedded.total"}}),c=(null===(t=d.data._embedded)||void 0===t?void 0:t.items)||[];n=n.concat(c);const u=(null===(o=d.data._embedded)||void 0===o?void 0:o.total)||0;r+=c.length,s=r({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);const o=yield e.delete("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${t}`,"Content-Type":"application/json"},params:{path:a?`/${a}`:"/",permanently:!1}});return 202===o.status||204===o.status}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(a){var t,o;return m(this,void 0,void 0,(function*(){try{const i=this.config.access_token,n=a.split("/").filter((e=>e.length>0));let r="";for(const a of n)if(r+="/"+a,!this.folderExistsCache.has(r))try{yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:r}}),this.folderExistsCache.add(r)}catch(a){if(404!==(null===(t=a.response)||void 0===t?void 0:t.status))return console.error("Error checking directory:",a),!1;try{yield e.put(`https://cloud-api.yandex.net/v1/disk/resources?path=${encodeURIComponent(r)}`,null,{headers:{Authorization:`OAuth ${i}`}}),this.folderExistsCache.add(r)}catch(e){if(409!==(null===(o=e.response)||void 0===o?void 0:o.status))return console.error("Error creating directory:",e),!1;this.folderExistsCache.add(r)}}return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}getAuthUrl(e){return`https://oauth.yandex.com/authorize?response_type=code&client_id=${C.yandexClientId}&redirect_uri=${e}&force_confirm=true`}}class M extends ${constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=this.baseFolder+"/"+t;for(;i.startsWith("/");)i=i.substring(1);const n=i.substring(0,i.lastIndexOf("/"));if(n){if(!(yield this.ensureDirectoryExists(n)))return console.error("Failed to create directory:",n),!1}const r=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/upload",{headers:{Authorization:`OAuth ${o}`,"Content-Type":"application/json"},params:{path:`/${i}`,overwrite:!0}});if(200!==r.status)return console.error("Error getting upload URL:",r),!1;const l=r.data.href;let s=t.split("/").pop()||"",d=new File([a],s,{lastModified:(new Date).getTime(),type:a.type});const c=yield e.put(l,d,{headers:{"Content-Type":a.type||"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0});return!(c.status>=300)||(console.error("Error occurred during file upload:",c),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);const i=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/download",{headers:{Authorization:`OAuth ${t}`,"Content-Type":"application/json"},params:{path:`/${o}`}});if(200!==i.status)return console.error("Error getting download URL:",i),!1;const n=i.data.href,r=yield e({url:n,method:"get",maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return r.status>=300?(console.error("Error occurred during file download:",r),!1):r.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class U{constructor(e){this.isExp=!1,this.folderIdCache=new Map,this.config=e,this.taskQueue=new k(3),this.isExp=this.config.isExp||!1,this.baseFolder="KoodoReader"}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getFileId(a,t){return m(this,void 0,void 0,(function*(){const o=this.config.access_token,i=`https://www.googleapis.com/drive/v3/files?q=name='${a}'+and+'${t}'+in+parents&fields=files(id,name)`;try{const a=yield e.get(i,{headers:{Authorization:"Bearer "+o}});if(0===a.data.files.length)return"";const t=a.data.files;return t.length>0?t[0].id:null}catch(e){return console.error("Error occurred during file list retrieval:",e),""}}))}checkFolder(a){return m(this,void 0,void 0,(function*(){a=this.baseFolder+"/"+a;const t=this.config.access_token;if(""===a)return"root";if(this.folderIdCache.has(a))return this.folderIdCache.get(a);const o=a.split("/").filter((e=>""!==e.trim()));let i="root",n="";for(const a of o){if(n=n?n+"/"+a:a,this.folderIdCache.has(n)){i=this.folderIdCache.get(n);continue}let o=yield this.getFolderId(a,i);if(!o){const n={name:a,mimeType:"application/vnd.google-apps.folder",parents:[i]};try{o=(yield e.post("https://www.googleapis.com/drive/v3/files",n,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.id}catch(e){throw console.error(`Error occurred during folder creation for ${a}:`,e),e}}this.folderIdCache.set(n,o),i=o}return i}))}getFolderId(a,t){return m(this,void 0,void 0,(function*(){const o=this.config.access_token,i=`https://www.googleapis.com/drive/v3/files?q=name='${a=encodeURIComponent(a)}'+and+mimeType='application/vnd.google-apps.folder'+and+'${t}'+in+parents&fields=files(id,name)`;try{const a=(yield e.get(i,{headers:{Authorization:`Bearer ${o}`}})).data.files;return a.length>0?a[0].id:null}catch(e){throw console.error("Error occurred during fetching folder ID:",e),e}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=yield this.checkFolder(a),i=[],n="",r=!0;for(;r;){let a=`https://www.googleapis.com/drive/v3/files?q='${o}'+in+parents&fields=nextPageToken,files(id,name,size,mimeType)&pageSize=1000`;n&&(a+=`&pageToken=${n}`);const l=yield e.get(a,{headers:{Authorization:`Bearer ${t}`}}),s=l.data.files||[];i=i.concat(s),n=l.data.nextPageToken,r=!!n}return[...new Set(i.map((e=>({name:e.name,size:e.size||0,type:"application/vnd.google-apps.folder"===e.mimeType?"folder":"file",modified:e.modifiedTime}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQue(e)}))))))}))}deleteFileWithoutQue(a){return m(this,void 0,void 0,(function*(){const t=a.split("/").pop()||"",o=a.split("/").slice(0,-1).join("/"),i=yield this.checkFolder(o),n=this.config.access_token,r=yield this.getFileId(t,i);if(""===r)return console.error("File not found:",t),!0;try{const a=yield e.delete(`https://www.googleapis.com/drive/v3/files/${r}`,{headers:{Authorization:`Bearer ${n}`}});return console.error("File deleted:",a),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${e}&prompt=consent&response_type=code&client_id=${C.googleClientId}&scope=https://www.googleapis.com/auth/${this.isExp?"drive":"drive.file"}&access_type=offline`}}class B extends U{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type}),r=t.split(".").pop(),l=p(r||""),s=t.split("/")[0],d=yield this.checkFolder(s),c=yield this.getFileId(i||"",d);const u={mimeType:l,name:i,parents:[d]},m=c?`https://www.googleapis.com/upload/drive/v3/files/${c}?uploadType=resumable`:"https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable",h=(yield e({method:c?"PATCH":"POST",url:m,data:c?null:JSON.stringify(u),headers:{Authorization:"Bearer "+o,"Content-Type":"application/json; charset=UTF-8"},maxContentLength:1/0,maxBodyLength:1/0})).headers.location,g=yield this.getData(n);if(0===Object.keys(g).length)return!1;const f=yield e.put(h,g.data,{headers:{Authorization:"Bearer "+o,"Content-Type":"application/zip","Content-Range":`bytes 0-${g.fileSize-1}/${g.fileSize}`},maxContentLength:1/0,maxBodyLength:1/0});return!(f.status>=300)||(console.error("Error occurred during file download:",f),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=a.split("/").pop(),i=a.split("/")[0],n=yield this.checkFolder(i),r=yield this.getFileId(o||"",n);if(!r)return console.error("File not found:",o),!0;const l=`https://www.googleapis.com/drive/v3/files/${r}?alt=media`,s=yield e.get(l,{headers:{Authorization:"Bearer "+t},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return s.status>=300?(console.error("Error occurred during file download:",s),!1):s.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getData(e){return m(this,void 0,void 0,(function*(){return e?new Promise(((a,t)=>{const o=new FileReader;o.onload=t=>a({fileName:e.name,mimeType:e.type,fileSize:e.size,data:t.target.result}),o.onerror=e=>t(e),o.readAsArrayBuffer(e)})):{}}))}}class z{constructor(e){this.folderCreationLocks=new Map,this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=2){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getStorage(){return m(this,void 0,void 0,(function*(){if(this.storage)return this.storage;let{email:e,password:t}=this.config;return this.storage=yield new a({email:e,password:t,userAgent:"KoodoReader/1.0"}).ready,this.storage}))}getRoot(){return m(this,void 0,void 0,(function*(){if(this.root)return this.root;const e=(yield this.getStorage()).root;if(""===this.baseFolder)return this.root=e,this.root;let a=e.children.find((e=>e.name===this.baseFolder&&e.directory));return a||(a=yield e.mkdir(this.baseFolder)),this.root=a,this.root}))}createFolder(e,a){return m(this,void 0,void 0,(function*(){const t=`${e.nodeId}_${a}`;if(this.folderCreationLocks.has(t))return yield this.folderCreationLocks.get(t);const o=(()=>m(this,void 0,void 0,(function*(){try{let t=e.children.find((e=>e.name===a&&e.directory));return t||(t=yield e.mkdir(a),t)}finally{this.folderCreationLocks.delete(t)}})))();return this.folderCreationLocks.set(t,o),yield o}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){try{let a=yield this.getRoot();if(e){const t=e.split("/").filter((e=>e));for(const e of t){const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return[];a=t}}return a.children.map((e=>({name:e.name,size:e.size||0,type:e.directory?"folder":"file",modified:e.timestamp?new Date(1e3*e.timestamp).toISOString():""})))}catch(e){return console.error("Error listing MEGA files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return m(this,void 0,void 0,(function*(){try{let a=yield this.getRoot();const t=e.split("/"),o=t.pop();for(const e of t){if(!e)continue;const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return!0;a=t}const i=a.children.find((e=>e.name===o&&!e.directory));return!i||(yield i.delete(),!0)}catch(e){return console.error("Error deleting MEGA file:",e),!1}}))}}class D extends z{constructor(e){super(e)}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{let o=yield this.getRoot();const i=a.split("/"),n=i.pop()||"";for(const e of i){if(!e)continue;let a=o.children.find((a=>a.name===e&&a.directory));a||(a=yield this.createFolder(o,e)),o=a}const r=new File([e],n,{lastModified:(new Date).getTime(),type:e.type}),l=yield e.arrayBuffer(),s=new Uint8Array(l),d=t.from(s),c=o.children.find((e=>e.name===n&&!e.directory));return c&&(yield c.delete()),yield o.upload({name:n,size:r.size},d).complete,!0}catch(e){return console.error("Error occurred during MEGA file upload:",e),!1}}))))))}))}downloadFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let a=yield this.getRoot();const t=e.split("/"),o=t.pop()||"";for(const e of t){if(!e)continue;const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return!0;a=t}const i=a.children.find((e=>e.name===o&&!e.directory));if(!i)return!0;const n=yield i.downloadBuffer();return this.taskQueue.setDownloadedSize(n.size),n.buffer}catch(e){return console.error("Error occurred during MEGA file download:",e),!1}}))))))}))}}class L{constructor(e){this.isExp=!1,this.baseUrl="https://graph.microsoft.com/v1.0/me/drive/special/approot",this.config=e,this.taskQueue=new k(3),this.isExp=this.config.isExp||!1,this.baseUrl=this.isExp?"https://graph.microsoft.com/v1.0/me/drive/root":"https://graph.microsoft.com/v1.0/me/drive/special/approot",void 0===this.config.baseFolder?this.baseFolder=this.isExp?"KoodoReader":"":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);let o,i=[];if(""===a)o=`${this.baseUrl}/children`;else{const e=encodeURIComponent(a);o=`${this.baseUrl}:/${e}:/children`}for(;o;){const a=yield e.get(o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(a.status>=300)break;const n=a.data.value||[];i=i.concat(n),o=a.data["@odata.nextLink"]||""}return[...new Set(i.map((e=>({name:e.name,size:e.size||0,type:e.folder?"folder":"file",modified:e.lastModifiedDateTime}))))]}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);const o=yield e.delete(`${this.baseUrl}:/${a}`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return!(o.status>=300)||(console.error("Error deleting file:",o),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${C.microsoftClientId}&scope=${this.isExp?"files.readwrite.all":"files.readwrite.appfolder"} offline_access&response_type=code&redirect_uri=${e}`}}class P extends L{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type}),r=this.baseFolder+"/"+t;for(;r.startsWith("/");)r=r.substring(1);const l=this.baseUrl+":/"+r+":/createUploadSession",s=yield e.post(l,null,{headers:{Authorization:"Bearer "+o,"Content-Type":"application/json"},maxContentLength:1/0,maxBodyLength:1/0});let d=n.size;const c=n.type,u=s.data.uploadUrl,m=yield e.put(u,n,{headers:{"Content-Type":c,"Content-Range":`bytes 0-${d-1}/${d}`},maxContentLength:1/0,maxBodyLength:1/0});return!(m.status>=300)||(console.error("Error occurred during file download:",m),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);const i=`${this.baseUrl}:/${o}:/content`,n=yield e.get(i,{responseType:"arraybuffer",headers:{Authorization:"Bearer "+t},maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error occurred during file download:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class j{downloadFile(e,a){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}listFiles(e){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e([])}))}))}getAuthUrl(){return""}}class K{constructor(e){this.baseUrl="https://api.pcloud.com",this.config=e,this.taskQueue=new k(3),this.baseUrl="2"===e.region?"https://eapi.pcloud.com":"https://api.pcloud.com"}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}checkFolderExists(a,t){return m(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:t,path:`/${a}`}})).data.result}catch(e){return console.error("Error checking folder:",e),!1}}))}createFolder(a,t){return m(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/createfolderifnotexists`,{params:{access_token:t,path:`/${a}`}})).data.result}catch(e){return console.error("Error creating folder:",e),!1}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:t,path:"/"+a,recursive:0}});return 0!==o.data.result?[]:o.data.metadata.contents.map((e=>({name:e.name,size:e.size||0,type:e.isfolder?"folder":"file",modified:e.modified})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/deletefile`,{params:{access_token:t,path:"/"+a}});return 0===o.data.result||(console.error("Error deleting file:",o.data),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://my.pcloud.com/oauth2/authorize?client_id=${C.pcloudClientId}&response_type=code&redirect_uri=${e}`}}class H extends K{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.refresh_token,i=t.split("/").slice(0,-1).join("/");if(!(yield this.checkFolderExists(i,o))){if(!(yield this.createFolder(i,o)))return!1}let n=t.split("/").pop()||"",r=new File([a],n,{lastModified:(new Date).getTime(),type:a.type});const l=new FormData;l.append("file",r);const s=yield e.post(`${this.baseUrl}/uploadfile`,l,{params:{access_token:o,path:`/${i}`,renew:1},maxContentLength:1/0,maxBodyLength:1/0});return 0===s.data.result||(console.error("Error uploading file:",s.data),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/getfilelink`,{params:{access_token:t,path:`/${a}`}});if(0!==o.data.result)return console.error("Error getting file link:",o.data),!0;const i=`https://${o.data.hosts[0]}${o.data.path}`,n=yield e.get(i,{responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error downloading file:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class J{constructor(e){this.config=e,this.taskQueue=new k(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=0){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}shouldUsePathStyle(){try{if(this.config.forcePathStyle&&"no"!==this.config.forcePathStyle)return!0;let e=this.config.endpoint;const a=new URL(e),t=a.hostname,o=/^(\d{1,3}\.){3}\d{1,3}$/.test(t),i=""!==a.port;return!o&&i}catch(e){return!0}}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){let{endpoint:a,region:t,bucketName:n,accessKeyId:r,secretAccessKey:l,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;let d=s+"/"+e;for(;d.startsWith("/");)d=d.substring(1);""===d||d.endsWith("/")||(d+="/");const c=new o({endpoint:a,region:t,credentials:{accessKeyId:r,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});try{let e,a=[],t=[],o=!0;for(;o;){const r=yield c.send(new i({Bucket:n,Prefix:d,Delimiter:"/",ContinuationToken:e}));r.Contents&&(a=a.concat(r.Contents)),r.CommonPrefixes&&(t=t.concat(r.CommonPrefixes)),e=r.NextContinuationToken,o=!!e}let r=[];return a.forEach((e=>{if(!e.Key.endsWith("/")){const a=e.Key.substring(d.length);a.includes("/")||r.push({name:a,size:e.Size||0,type:"file",modified:e.LastModified?e.LastModified.toISOString():""})}})),t.forEach((e=>{const a=e.Prefix.substring(d.length).replace(/\/$/,"");a&&r.push({name:a,size:0,type:"folder",modified:""})})),r}catch(e){return console.error(e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){let{endpoint:a,region:t,bucketName:i,accessKeyId:r,secretAccessKey:l,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;const d=new o({endpoint:a,region:t,credentials:{accessKeyId:r,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});let c=s+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{return yield d.send(new n({Bucket:i,Key:c})),!0}catch(e){return console.error(e),!1}}))}}class W extends J{constructor(e){super(e)}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:n,accessKeyId:l,secretAccessKey:s,dir:d}=this.config;const c=new o({endpoint:t,region:i,credentials:{accessKeyId:l,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});d=d&&"KoodoReader"===this.baseFolder?d:this.baseFolder;let u=d+"/"+a;for(;u.startsWith("/");)u=u.substring(1);try{let a=yield c.send(new r({Bucket:n,Key:u,Body:e}));return 200===a.$metadata.httpStatusCode||(console.error("Error uploading file:",a),!1)}catch(e){return console.error("Error: ",e),!1}}))))))}))}downloadFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let{endpoint:a,region:t,bucketName:i,accessKeyId:n,secretAccessKey:r,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;const d=new o({endpoint:a,region:t,credentials:{accessKeyId:n,secretAccessKey:r},forcePathStyle:this.shouldUsePathStyle()});let c=s+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{const e=yield d.send(new l({Bucket:i,Key:c}));if(!e.Body)return console.error("No response body"),!1;const a=yield e.Body.transformToByteArray();return this.taskQueue.setDownloadedSize(a.length),a.buffer}catch(a){return console.error("Error downloading file:",a,e),!1}}))))))}))}}class q{constructor(e){this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder;a&&""!==a.trim()&&(o=o+"/"+a),o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));let i=[],n=0;const r=1e3;for(;;){const a=yield e.get("https://pan.baidu.com/rest/2.0/xpan/file",{params:{method:"list",access_token:t,dir:"/"+o,start:n,limit:r,order:"name",desc:0,web:1,folder:0},headers:{"User-Agent":"pan.baidu.com"}});if(a.status>=300||0!==a.data.errno){console.error("百度网盘API错误:",a.data);break}const l=a.data.list||[];if(0===l.length)break;if(i=i.concat(l),l.length({name:e.server_filename,size:e.size||0,type:e.isdir?"folder":"file",modified:new Date(1e3*e.server_mtime).toISOString(),path:e.path,fs_id:e.fs_id})))}catch(e){return console.error("获取百度网盘文件列表时发生错误:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));const i=new URLSearchParams({async:"0",filelist:JSON.stringify(["/"+o])}),n=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=filemanager&access_token=${t}&opera=delete`,i.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==n.data.errno)return console.error("百度网盘删除文件API错误:",n.data),-9===n.data.errno?console.error("文件不存在"):111===n.data.errno?console.error("有其他异步任务正在执行"):-7===n.data.errno&&console.error("文件名非法"),!1;const r=n.data.info||[];for(const e of r)if(0!==e.errno)return console.error(`文件删除失败: ${e.path}, 错误码: ${e.errno}`),!1;return!0}catch(e){return console.error("删除文件时发生错误:",e),!1}}))}getAuthUrl(e){return`https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=${C.duboxClientId}&redirect_uri=${e}&scope=basic,netdisk&device_id=119827642&display=page&qrcode=1`}}const G=4194304;class Q extends q{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var o;try{const o=this.config.access_token;let i=this.baseFolder+"/"+t;i=i.replace(/\/+/g,"/"),i.startsWith("/")&&(i=i.substring(1));const n=yield a.arrayBuffer(),r=n.byteLength,l=new Uint8Array(n),{contentMd5:s,sliceMd5:d,blockList:c}=this.calculateFileMd5(l,r),u=new URLSearchParams({path:"/"+i,size:r.toString(),isdir:"0",autoinit:"1",rtype:"3",block_list:JSON.stringify(c),"content-md5":s,"slice-md5":d,local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),m=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=${o}`,u.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==m.data.errno)return console.error("预上传失败:",m.data),!1;const p=m.data.uploadid,h=m.data.block_list||[];if(0===h.length)return!0;const g=yield this.getUploadDomain(o,"/"+i,p);if(!g)return console.error("获取上传域名失败"),!1;for(const a of h){const t=a*G,n=Math.min(G,r-t),s=l.slice(t,t+n),d=new FormData;d.append("file",new Blob([s],{type:"application/octet-stream"}),`chunk_${a}`);const u=`${g}/rest/2.0/pcs/superfile2?method=upload&access_token=${o}&type=tmpfile&path=${encodeURIComponent("/"+i)}&uploadid=${p}&partseq=${a}`,m=yield e.post(u,d,{headers:{"User-Agent":"pan.baidu.com"},maxContentLength:1/0,maxBodyLength:1/0,timeout:0});if(m.status>=300)throw new Error(`分片上传失败: ${JSON.stringify(m.data)}`);const h=m.data.md5,f=c[a];h&&h!==f&&console.warn(`分片 ${a} MD5不匹配: 期望 ${f}, 实际 ${h}`)}const f=new URLSearchParams({path:"/"+i,size:r.toString(),isdir:"0",block_list:JSON.stringify(c),uploadid:p,rtype:"3",local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),y=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${o}`,f.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});return 0===y.data.errno||(console.error("创建文件失败:",y.data),!1)}catch(e){return console.error("文件上传过程中发生错误:",(null===(o=e.response)||void 0===o?void 0:o.data)||e.message||e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var t;this.taskQueue.setDownloadedSize(0);try{const o=this.config.access_token;let i=this.baseFolder+"/"+a;i=i.replace(/\/+/g,"/"),i.startsWith("/")&&(i=i.substring(1));const n=yield this.listFileInfos(a.substring(0,a.lastIndexOf("/"))),r=i.split("/").pop(),l=n.find((e=>e.name===r));if(!l)return console.error("文件不存在:",a),!1;const s=yield e.get("https://pan.baidu.com/rest/2.0/xpan/multimedia",{params:{method:"filemetas",access_token:o,fsids:JSON.stringify([l.fs_id]),dlink:1},headers:{"User-Agent":"pan.baidu.com"}});if(0!==s.data.errno||!(null===(t=s.data.list)||void 0===t?void 0:t[0]))return console.error("获取下载链接失败:",s.data),!1;const d=s.data.list[0].dlink;return(yield e.get(d,{responseType:"arraybuffer",params:{access_token:o},headers:{"User-Agent":"pan.baidu.com"},onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}})).data}catch(e){return console.error("下载文件时发生错误:",e),!1}}))))))}))}getUploadDomain(a,t,o){return m(this,void 0,void 0,(function*(){try{const i=yield e.get("https://d.pcs.baidu.com/rest/2.0/pcs/file",{params:{method:"locateupload",appid:"250528",access_token:a,path:t,uploadid:o,upload_version:"2.0"},headers:{"User-Agent":"pan.baidu.com"}});if(0!==i.data.error_code)return console.error("获取上传域名失败:",i.data),null;const n=i.data.servers||[],r=n.find((e=>e.server.startsWith("https://")));return r?r.server:n.length>0?n[0].server:(console.error("没有可用的上传服务器"),null)}catch(e){return console.error("获取上传域名时出错:",e),null}}))}calculateFileMd5(e,a){const t=[];let o="",i=0;for(;i=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getUploadCredentials(a){return m(this,void 0,void 0,(function*(){try{const t=yield e.get(`${this.baseUrl}/open/upload/get_token`,{headers:{Authorization:`Bearer ${a}`}});return t.status>=300||!t.data.state?(console.error("Error getting upload credentials:",t.data),null):t.data.data}catch(e){return console.error("Error occurred during get upload credentials:",e),null}}))}generateOSSPolicy(e,a,t=new Date(Date.now()+36e5)){const o={expiration:t.toISOString(),conditions:[{bucket:e},{key:a},["starts-with","$success_action_status","2"],["content-length-range",0,1073741824]]};return JSON.stringify(o)}getAuthUrl(e){return`https://passportapi.115.com/open/authorize?client_id=${C.yiyiwuClientId}&response_type=code&redirect_uri=${e}`}}class X extends Y{constructor(e){super(e)}sha1Hex(e){return m(this,void 0,void 0,(function*(){const a=yield crypto.subtle.digest("SHA-1",e);return Array.from(new Uint8Array(a)).map((e=>e.toString(16).padStart(2,"0"))).join("")}))}calculateFileSha1(e){return m(this,void 0,void 0,(function*(){try{const a=yield e.arrayBuffer();return this.sha1Hex(a)}catch(e){return console.error("Error calculating file SHA1:",e),""}}))}calculatePreSha1(e){return m(this,void 0,void 0,(function*(){try{const a=e.slice(0,131072),t=yield a.arrayBuffer();return this.sha1Hex(t)}catch(e){return console.error("Error calculating pre SHA1:",e),""}}))}calculateOSSSignature(e,a){const t=s.enc.Base64.stringify(s.enc.Utf8.parse(a));return s.HmacSHA1(t,e).toString(s.enc.Base64)}handleSecondAuth(e,a,t,o,i,n,r,l){return m(this,void 0,void 0,(function*(){try{if(!a.sign_check)return console.error("No sign_check provided for second authentication"),null;const[s,d]=a.sign_check.split("-"),c=parseInt(s),u=parseInt(d),m=t.slice(c,u+1),p=yield m.arrayBuffer(),h=(yield this.sha1Hex(p)).toUpperCase();return yield this.initializeUpload(e,o,i,n,r,l,a.sign_key,h,a.pick_code)}catch(e){return console.error("Error during second authentication:",e),null}}))}uploadToObjectStorage(a,t,o,i){var n;return m(this,void 0,void 0,(function*(){try{const n=i.endpoint,r=o.bucket,l=o.object;let s;if(n.includes(r))s=n;else{s=`https://${r}.${n.replace(/^https?:\/\//,"")}`}const d=this.generateOSSPolicy(r,l),c=this.calculateOSSSignature(i.AccessKeySecret,d),u=btoa(d),m=new FormData;if(m.append("key",l),m.append("policy",u),m.append("OSSAccessKeyId",i.AccessKeyId),m.append("signature",c),m.append("x-oss-security-token",i.SecurityToken),m.append("success_action_status","200"),o.callback&&o.callback.callback){const e=btoa(o.callback.callback);if(m.append("callback",e),o.callback.callback_var){const e=JSON.parse(o.callback.callback_var);for(const[a,t]of Object.entries(e))m.append(a,String(t))}}const p=new File([a],t,{type:a.type});m.append("file",p);const h=yield e.post(s,m,{maxContentLength:1/0,maxBodyLength:1/0});return 200===h.status||204===h.status||(console.error("Upload failed with status:",h.status),!1)}catch(e){return console.error("Error uploading file via REST API:",(null===(n=e.response)||void 0===n?void 0:n.data)||e.message||e),!1}}))}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var t;try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;o.startsWith("/")||(o="/"+o);const i=e.size,n=yield this.calculateFileSha1(e),r=yield this.calculatePreSha1(e),l=a.split("/").pop()||a,s=o.substring(0,o.lastIndexOf("/"))||"/";let d=yield this.getFolderInfo(s,!0),c="0";if(d)c=d.file_id;else{let e=yield this.createFolder(s);if(!e)return console.error("Failed to create folder:",s),!1;c=e}yield this.deleteFileWithoutQueue(a);let u=yield this.initializeUpload(c,l,i,n,r,t);if(!u)return console.error("Failed to initialize upload"),!1;if((6===u.status||7===u.status||8===u.status)&&(u=yield this.handleSecondAuth(c,u,e,l,i,n,r,t),!u))return console.error("Second authentication failed"),!1;if(2===u.status)return console.info(`File ${a} uploaded successfully via instant upload.`),!0;const m=yield this.getUploadCredentials(t);if(!m)return console.error("Failed to get upload credentials"),!1;return(yield this.uploadToObjectStorage(e,l,u,m))?(console.info(`File ${a} uploaded successfully.`),!0):(console.error("Failed to upload to object storage"),!1)}catch(e){return console.error("Error occurred during file upload:",(null===(t=e.response)||void 0===t?void 0:t.data)||e.message||e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let t=this.baseFolder+"/"+a;t=t.replace(/\/+/g,"/"),t.startsWith("/")||(t="/"+t);const o=yield this.getFolderInfo(t,!1);if(!o||!o.pick_code)return console.error("Failed to get file info or pick_code for:",a),!1;const i=yield this.getFileDownloadUrl(o.pick_code);if(!i)return console.error("Failed to get download URL for:",a),!1;const n=yield e.get(i.url,{responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error downloading file:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}initializeUpload(a,t,o,i,n,r,l,s,d){return m(this,void 0,void 0,(function*(){try{const c=new FormData;c.append("file_name",t),c.append("file_size",o.toString()),a?c.append("target","U_1_"+a):c.append("target","U_1_0"),c.append("fileid",i),c.append("preid",n),c.append("topupload","0"),d&&c.append("pick_code",d),l&&c.append("sign_key",l),s&&c.append("sign_val",s);const u=yield e.post(`${this.baseUrl}/open/upload/init`,c,{headers:{Authorization:`Bearer ${r}`,"Content-Type":"multipart/form-data"}});return u.status>=300||!u.data.state?(console.error("Error initializing upload:",u.data),null):u.data.data}catch(e){return console.error("Error occurred during upload initialization:",e),null}}))}createFolder(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=a.replace(/^\/+|\/+$/g,"");if(!o)return"";const i=o.split("/");let n="",r="0";for(const a of i){n=n?`${n}/${a}`:a;const o=yield this.getFolderInfo(n,!0);if(o&&o.file_id)r=o.file_id;else{const o=new FormData;o.append("pid",r),o.append("file_name",a);const i=yield e.post(`${this.baseUrl}/open/folder/add`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});if(i.status>=300||!i.data.state)return console.error("Error creating folder:",i.data),"";r=i.data.data.file_id}}return r}catch(e){return console.error("Error occurred during folder creation:",e),""}}))}getFolderInfo(a,t){return m(this,void 0,void 0,(function*(){if(""===a||"/"===a)return{file_id:"0"};a.startsWith("/")||(a="/"+a);try{const t=this.config.access_token,o=new FormData;o.append("path",a);const i=yield e.post(`${this.baseUrl}/open/folder/get_info`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});return i.status>=300||!i.data.state||0===i.data.data.length?(console.error("Error getting file info:",i.data),null):i.data.data}catch(e){return console.error("Error occurred during get file info:",e),null}}))}getFileDownloadUrl(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=new FormData;o.append("pick_code",a);const i=yield e.post(`${this.baseUrl}/open/ufile/downurl`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});if(i.status>=300)return console.error("Error getting download URL:",i.data),null;const n=i.data.data,r=Object.keys(n)[0];return r&&n[r]?n[r].url:(console.error("No file data found in download URL response"),null)}catch(e){return console.error("Error occurred during get download URL:",e.message||e),null}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;(a=this.baseFolder+"/"+a).startsWith("/")||(a="/"+a);let o=[],i=0;const n=1150;let r=!0,l=yield this.getFolderInfo(a,!0),s="";if(l)s=l.file_id;else{let e=yield this.createFolder(a);if(!e)return console.error("Failed to create folder:",a),[];s=e}if(!s)return console.error("Failed to get or create folder ID:",a),[];let d=s;for(;r;){const a={offset:i,limit:n,cur:1,show_dir:1};d&&(a.cid=d);const l=yield e.get(`${this.baseUrl}/open/ufile/files`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},params:a});if(l.status>=300)break;const s=l.data.data||[];o=o.concat(s),s.length({name:e.fn,size:e.fs||0,type:"0"===e.fc?"folder":"file",modified:new Date(1e3*e.upt).toISOString()})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;a=this.baseFolder+"/"+a;const o=yield this.getFolderInfo(a,!1);if(!o)return!0;const i=new FormData;i.append("file_ids",o.file_id);const n=yield e.post(`${this.baseUrl}/open/ufile/delete`,i,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});return!(n.status>=300||!n.data.state)||(console.error("Error deleting file:",n),!1)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}}class V{constructor(e){let{username:a,password:t,url:o,dir:i,AuthType:n,createClient:r}=e;void 0===e.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=e.baseFolder,i=i&&"KoodoReader"===this.baseFolder?i:this.baseFolder,this.username=a,this.password=t,this.url=o,this.dir=i,this.taskQueue=new k(5),this.AuthType=n,this.createClient=r}getClient(){return m(this,void 0,void 0,(function*(){return this.webdavClient||(this.url=yield this.handleUrlRedirection(this.url),this.webdavClient=this.createClient(this.url,{authType:this.AuthType.Password,username:this.username,password:this.password})),this.webdavClient}))}handleUrlRedirection(a){return m(this,void 0,void 0,(function*(){try{const t=yield e.head(a,{maxRedirects:0,validateStatus:()=>!0,timeout:5e3});return t.request&&t.request.responseURL&&t.request.responseURL!==a?t.request.responseURL:t.status>=300&&t.status<400&&t.headers.location?t.headers.location:a}catch(e){return console.info("Error handling URL redirection:",e),a}}))}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){const a=yield this.getClient();try{const t=a.getDirectoryContents(this.dir+"/"+e),o=new Promise(((e,a)=>{setTimeout((()=>a(new Error("WebDAV list directory timeout"))),5e3)}));return(yield Promise.race([t,o])).filter((a=>"."!==a.filename&&".."!==a.filename&&a.filename!==e)).map((e=>({name:e.basename,size:e.size||0,type:"directory"===e.type?"folder":"file",modified:e.lastmod})))}catch(t){return t.response&&404===t.response.status&&(yield a.createDirectory(this.dir+"/"+e)),console.error("Error listing files:",t),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){const a=yield this.getClient();try{return yield a.deleteFile(this.dir+"/"+e),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(e){return m(this,void 0,void 0,(function*(){let a=yield this.getClient();try{const t=e.replace(/^\/+|\/+$/g,"").split("/").filter((e=>e.length>0));let o="";for(const e of t)o=o?`${o}/${e}`:e,(yield a.exists(`/${o}`))||(yield a.createDirectory(`/${o}`));return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}}class Z extends V{constructor(e){super(Object.assign(Object.assign({},e),{AuthType:d,createClient:c}))}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{let o=this.dir+"/"+t,i=yield this.getClient();const n=i.exists(o.substring(0,o.lastIndexOf("/"))),r=new Promise(((e,a)=>{setTimeout((()=>a(new Error("WebDAV exists check timeout"))),5e3)}));!1===(yield Promise.race([n,r]))&&(yield this.ensureDirectoryExists(o.substring(0,o.lastIndexOf("/"))));let l=t.split("/").pop()||"",s=new File([a],l,{lastModified:(new Date).getTime(),type:a.type}),d=i.getFileUploadLink(this.dir+"/"+t);const c=new URL(d);c.search="",d=c.toString();const u=btoa(this.username+":"+this.password),m=yield e.put(d,s,{headers:{Authorization:"Basic "+u},maxContentLength:1/0,maxBodyLength:1/0});return!(m.status>=300)||(console.error("Error occurred during file upload:",m),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){if(this.taskQueue.setDownloadedSize(0),-1===a.indexOf("."))return new ArrayBuffer(0);try{const t=btoa(this.username+":"+this.password);let o=this.url.endsWith("/")?this.url:this.url+"/",i=this.dir.startsWith("/")?this.dir.substring(1):this.dir;const n=yield e({url:o+i+"/"+a,method:"get",headers:{Authorization:"Basic "+t},responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error occurred during file download:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ee{constructor(e){this.username=e.username,this.password=e.password,this.url=e.url,this.taskQueue=new k(3)}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{return(yield e.get(`${this.url}/list`,{params:{dir:a},auth:{username:this.username,password:this.password}})).data.files.map((e=>({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modifiedTime})))||[]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{return(yield e.delete(`${this.url}/delete`,{params:{dir:a.split("/").slice(0,-1).join("/")||"",filename:a.split("/").pop()},auth:{username:this.username,password:this.password}})).data.success}catch(e){return console.error("Error deleting file:",e),!1}}))}}class ae extends ee{constructor(e){super(e)}getAuthHeader(){return`Basic ${btoa(`${this.username}:${this.password}`)}`}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=t.split("/").pop()||"",i=t.substring(0,t.lastIndexOf("/"))||"";let n=this.listFiles("");const r=new Promise(((e,a)=>{setTimeout((()=>a(new Error("Docker connection timeout"))),5e3)}));yield Promise.race([n,r]);let l=new File([a],o,{lastModified:(new Date).getTime(),type:a.type});const s=new FormData;s.append("file",l);const d=yield e.post(`${this.url}/upload?dir=${encodeURIComponent(i)}`,s,{headers:{Authorization:this.getAuthHeader(),"Content-Type":"multipart/form-data"},maxContentLength:1/0,maxBodyLength:1/0});return!(d.status>=300)||(console.error("Error occurred during file upload:",d),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=a.split("/").pop()||"",o=a.substring(0,a.lastIndexOf("/"))||"",i=yield e({url:`${this.url}/download`,method:"GET",params:{dir:o,filename:t},headers:{Authorization:this.getAuthHeader()},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return i.status>=300?(console.error("Error occurred during file download:",i),!1):i.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}const te=["book","config","cover","font"];class oe{constructor(e,a){this.type=e,this.remote="dropbox"===e?new _(a):"microsoft"===e?new P(a):"google"===e?new B(a):"microsoft_exp"===e?new P(Object.assign(Object.assign({},a),{isExp:!0})):"google_exp"===e?new B(Object.assign(Object.assign({},a),{isExp:!0})):"s3compatible"===e?new W(a):"webdav"===e?new Z(a):"docker"===e?new ae(a):"boxnet"===e?new R(a):"mega"===e?new D(a):"adrive"===e?new I(a):"pcloud"===e?new H(a):"dubox"===e?new Q(a):"yandex"===e?new M(a):"yiyiwu"===e?new X(a):new j}downloadFile(e,a){return m(this,void 0,void 0,(function*(){if("cover"!==a){if(!(yield this.listFiles(a)).find((a=>e.indexOf(a)>-1)))return!1}return yield this.remote.downloadFile(a+"/"+e)}))}uploadFile(e,a,t){return m(this,void 0,void 0,(function*(){return 0===t.size||(yield this.remote.uploadFile(t,a+"/"+e))}))}deleteFile(e,a){return m(this,void 0,void 0,(function*(){return!(yield this.listFiles(a)).find((a=>e.indexOf(a)>-1))||(yield this.remote.deleteFile(a+"/"+e))}))}listFiles(e){return m(this,void 0,void 0,(function*(){return yield this.remote.listFiles(e)}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){return yield this.remote.listFileInfos(e)}))}isExist(e,a){return m(this,void 0,void 0,(function*(){return(yield this.listFiles(a)).find((a=>-1!==a.indexOf(e)))}))}downloadAllFiles(){return m(this,void 0,void 0,(function*(){for(let e of te){let a=yield this.listFiles(e);for(let t of a)yield this.downloadFile(t,e)}}))}getAuthUrl(e){return this.remote.getAuthUrl?this.remote.getAuthUrl(e):""}getStats(){return this.remote.taskQueue.getStats()}clearQueue(){return this.remote.taskQueue.clearQueue()}resetCounters(){this.remote.taskQueue.resetCounters()}getDownloadedSize(){return this.remote.taskQueue.getDownloadedSize()}}const ie={words:['ALTER TABLE words ADD COLUMN "sentence" text']},ne={notes:"SELECT * FROM notes WHERE key = ?",bookmarks:"SELECT * FROM bookmarks WHERE key = ?",books:"SELECT * FROM books WHERE key = ?",plugins:"SELECT * FROM plugins WHERE key = ?",words:"SELECT * FROM words WHERE key = ?"},re={notes:"SELECT * FROM notes WHERE bookKey = ?",bookmarks:"SELECT * FROM bookmarks WHERE bookKey = ?",words:"SELECT * FROM words WHERE bookKey = ?",books:"SELECT * FROM books WHERE key = ?"},le={notes:"DELETE FROM notes WHERE bookKey = ?",bookmarks:"DELETE FROM bookmarks WHERE bookKey = ?",words:"DELETE FROM words WHERE bookKey = ?"};function se(e){for(const a in e)e.hasOwnProperty(a)&&(e[`temp-${a}`]=e[a]);return e}const de={notes:e=>{let a=Object.assign({},e);return a.date=JSON.parse(e.date),a.tag=JSON.parse(e.tag),a},bookmarks:e=>e,books:e=>e,plugins:e=>{let a=Object.assign({},e);return e.autoValue||delete a.autoValue,e.langList?a.langList=JSON.parse(e.langList):delete a.langList,e.voiceList?a.voiceList=JSON.parse(e.voiceList):delete a.voiceList,a.config=JSON.parse(e.config),a},words:e=>{let a=Object.assign({},e);return a.date=JSON.parse(e.date),void 0===a.sentence&&(a.sentence=""),a}};var ce={sqlStatement:{createTableStatement:se({notes:'\n CREATE TABLE IF NOT EXISTS "notes" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "chapter" text,\n "chapterIndex" integer,\n "text" text,\n "cfi" text,\n "range" text,\n "notes" text,\n "percentage" text,\n "color" integer,\n "tag" array\n )\n ',bookmarks:'\n CREATE TABLE IF NOT EXISTS "bookmarks" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "cfi" text,\n "label" text,\n "percentage" text,\n "chapter" text\n );\n ',books:'\n CREATE TABLE IF NOT EXISTS "books" (\n "key" text PRIMARY KEY,\n "name" text,\n "author" text,\n "description" text,\n "md5" text,\n "cover" text,\n "format" text,\n "publisher" text,\n "size" integer,\n "page" integer,\n "path" text,\n "charset" text\n );\n ',plugins:'\n CREATE TABLE IF NOT EXISTS "plugins" (\n "key" text PRIMARY KEY,\n "type" text,\n "displayName" text,\n "icon" text,\n "version" text,\n "config" object,\n "autoValue" string,\n "langList" text,\n "voiceList" text,\n "scriptSHA256" text,\n "script" text\n );\n ',words:'\n CREATE TABLE IF NOT EXISTS "words" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "word" text,\n "sentence" text,\n "chapter" text\n );\n '}),migrateStatement:se(ie),getAllStatement:se({notes:"SELECT * FROM notes",bookmarks:"SELECT * FROM bookmarks",books:"SELECT * FROM books",plugins:"SELECT * FROM plugins",words:"SELECT * FROM words"}),getPagedStatement:se({notes:"SELECT * FROM notes LIMIT ? OFFSET ?",bookmarks:"SELECT * FROM bookmarks LIMIT ? OFFSET ?",books:"SELECT * FROM books LIMIT ? OFFSET ?",plugins:"SELECT * FROM plugins LIMIT ? OFFSET ?",words:"SELECT * FROM words LIMIT ? OFFSET ?"}),getCountStatement:se({notes:"SELECT COUNT(*) as count FROM notes",bookmarks:"SELECT COUNT(*) as count FROM bookmarks",books:"SELECT COUNT(*) as count FROM books",plugins:"SELECT COUNT(*) as count FROM plugins",words:"SELECT COUNT(*) as count FROM words"}),saveStatement:se({notes:"INSERT OR REPLACE INTO notes (key, bookKey, chapter, chapterIndex, text, cfi, range, notes, date, percentage, color, tag) VALUES (@key, @bookKey, @chapter, @chapterIndex, @text, @cfi, @range, @notes, @date, @percentage, @color, @tag)",bookmarks:"INSERT OR REPLACE INTO bookmarks (key, bookKey, cfi, label, percentage, chapter) VALUES (@key, @bookKey, @cfi, @label, @percentage, @chapter)",books:"INSERT OR REPLACE INTO books (key, name, author, description, md5, cover, format, publisher, size, page, path, charset) VALUES (@key, @name, @author, @description, @md5, @cover, @format, @publisher, @size, @page, @path, @charset)",plugins:"INSERT OR REPLACE INTO plugins (key, type, displayName, icon, version, config, autoValue, langList, voiceList, scriptSHA256, script) VALUES (@key, @type, @displayName, @icon, @version, @config, @autoValue, @langList, @voiceList, @scriptSHA256, @script)",words:"INSERT OR REPLACE INTO words (key, bookKey, date, word, sentence, chapter) VALUES (@key, @bookKey, @date, @word, @sentence, @chapter)"}),deleteAllStatement:se({notes:"DELETE FROM notes",bookmarks:"DELETE FROM bookmarks",books:"DELETE FROM books",plugins:"DELETE FROM plugins",words:"DELETE FROM words"}),updateStatement:se({notes:"UPDATE notes SET bookKey = @bookKey, chapter = @chapter, chapterIndex = @chapterIndex, text = @text, cfi = @cfi, range = @range, notes = @notes, date = @date, percentage = @percentage, color = @color, tag = @tag WHERE key = @key",bookmarks:"UPDATE bookmarks SET bookKey = @bookKey, cfi = @cfi, label = @label, percentage = @percentage, chapter = @chapter WHERE key = @key",books:"UPDATE books SET name = @name, author = @author, description = @description, md5 = @md5, cover = @cover, format = @format, publisher = @publisher, size = @size, page = @page, path = @path, charset = @charset WHERE key = @key",plugins:"UPDATE plugins SET type = @type, displayName = @displayName, icon = @icon, version = @version, config = @config, autoValue = @autoValue, langList = @langList, voiceList = @voiceList, scriptSHA256 = @scriptSHA256, script = @script WHERE key = @key",words:"UPDATE words SET bookKey = @bookKey, date = @date, word = @word, sentence = @sentence, chapter = @chapter WHERE key = @key"}),deleteStatement:se({notes:"DELETE FROM notes WHERE key = ?",bookmarks:"DELETE FROM bookmarks WHERE key = ?",books:"DELETE FROM books WHERE key = ?",plugins:"DELETE FROM plugins WHERE key = ?",words:"DELETE FROM words WHERE key = ?"}),dropStatement:se({notes:"DROP TABLE IF EXISTS notes",bookmarks:"DROP TABLE IF EXISTS bookmarks",books:"DROP TABLE IF EXISTS books",plugins:"DROP TABLE IF EXISTS plugins",words:"DROP TABLE IF EXISTS words"}),getStatement:se(ne),getByBookKeyStatement:se(re),getByBookKeysStatement:se({notes:e=>`SELECT * FROM notes WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,bookmarks:e=>`SELECT * FROM bookmarks WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,words:e=>`SELECT * FROM words WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")})`}),getKeysStatement:se({notes:"SELECT key FROM notes",bookmarks:"SELECT key FROM bookmarks",books:"SELECT key FROM books",plugins:"SELECT key FROM plugins",words:"SELECT key FROM words"}),getWithSortAndPageStatement:se({notes:(e,a,t,o)=>`SELECT * FROM notes ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,bookmarks:(e,a,t,o)=>`SELECT * FROM bookmarks ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,books:(e,a,t,o)=>`SELECT * FROM books ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,plugins:(e,a,t,o)=>`SELECT * FROM plugins ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,words:(e,a,t,o)=>`SELECT * FROM words ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`}),getByKeysStatement:se({notes:e=>`SELECT * FROM notes WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,bookmarks:e=>`SELECT * FROM bookmarks WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,plugins:e=>`SELECT * FROM plugins WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,words:e=>`SELECT * FROM words WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`}),deleteByBookKeyStatement:se(le)},jsonToSqlite:se({notes:e=>{let a=Object.assign({},e);return a.date=JSON.stringify(e.date),a.tag=JSON.stringify(e.tag),a},bookmarks:e=>e,books:e=>{let a=Object.assign({},e);return a.page=e.page||0,a},plugins:e=>{let a=Object.assign({},e);return e.autoValue||(a.autoValue=null),e.langList?a.langList=JSON.stringify(e.langList):a.langList=null,e.voiceList?a.voiceList=JSON.stringify(e.voiceList):a.voiceList=null,a.config=JSON.stringify(e.config),a},words:e=>{let a=Object.assign({},e);return a.date=JSON.stringify(e.date),void 0===a.sentence&&(a.sentence=""),a}}),sqliteToJson:se(de)};const ue=E.cloudUrl,me=E.cloudCNUrl;class pe{constructor(e,a,t){this.TokenService=e,this.ConfigService=a,this.baseUrl="china"===t?me:ue,this.serverRegion=t,this.refreshToken="",this.accessToken="",this.streamPromise=null,this.expiresAt=0}refreshUserToken(){return m(this,void 0,void 0,(function*(){if(this.refreshToken=yield this.TokenService.getToken("refresh_token"),!this.refreshToken)return{code:401,message:"refresh token not found"};let a=(yield e.post(this.baseUrl+"/api/v1/public/user/refresh_token",{refresh_token:this.refreshToken})).data;return 200===a.code&&(yield this.TokenService.setToken("access_token",a.data.access_token),yield this.TokenService.setToken("refresh_token",a.data.refresh_token),yield this.TokenService.setToken("expires_at",(1e3*a.data.expires_at).toString()),this.accessToken=a.data.access_token,this.refreshToken=a.data.refresh_token,this.expiresAt=1e3*a.data.expires_at),a}))}requestWithRetry(e){return m(this,void 0,void 0,(function*(){return pe.requestQueue||(pe.requestQueue=[]),new Promise(((a,t)=>{pe.requestQueue.push({config:e,resolve:a,reject:t}),pe.processingQueue||this.processQueue()}))}))}isTokenValid(){return m(this,void 0,void 0,(function*(){if(this.accessToken||(this.accessToken=(yield this.TokenService.getToken("access_token"))||""),!this.expiresAt){const e=yield this.TokenService.getToken("expires_at");this.expiresAt=e?parseInt(e):(new Date).getTime()+31536e9}return""!==this.accessToken&&this.expiresAt>(new Date).getTime()+6e4}))}processQueue(){return m(this,void 0,void 0,(function*(){if(!pe.processingQueue){pe.processingQueue=!0;try{for(;pe.requestQueue.length>0;){const e=pe.requestQueue.shift();try{let a=yield this.executeRequest(e.config);e.resolve(a)}catch(a){e.reject(a)}}}finally{pe.processingQueue=!1}}}))}executeRequest(a){return m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let t="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);if(a.baseURL=this.baseUrl,a.headers)a.headers.Authorization="Bearer "+this.accessToken,a.headers["X-Request-ID"]=t;else{let e=this.ConfigService.getItem("appVersion"),o=this.ConfigService.getItem("appPlatform");a.headers={Authorization:"Bearer "+this.accessToken,"X-Request-ID":t,"X-App-Version":e||"1.0.0","X-App-Platform":o||"web"}}let o=(yield e(a)).data;if(402===o.code){let t=yield this.refreshUserToken();if(200===t.code){return a.headers=a.headers||{},a.headers.Authorization="Bearer "+this.accessToken,(yield e(a)).data}return t}return 200!==o.code&&console.error("Request error:",o),o}catch(e){return console.error("Request execution error:",e),"Network Error"===e.message?{code:503,message:"network error",data:null,msg:"Network error, please try again later. 网络错误,请稍后再试。"}:{code:500,message:e.message||"Unknown error",msg:e.message||"Unknown error",data:null}}}))}requestWithStream(e,a,t){return m(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let o=this.accessToken||"",i="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((n,r)=>{let l=this.ConfigService.getItem("appVersion"),s=this.ConfigService.getItem("appPlatform");const d=new t(this.baseUrl+e.url,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+o,"X-Request-ID":i,"X-App-Version":l||"1.0.0","X-App-Platform":s||"web"},method:e.method,body:JSON.stringify(e.data),pollingInterval:0});d.addEventListener("open",(()=>{console.info("Connection to OpenAI established.")})),d.addEventListener("message",(e=>m(this,void 0,void 0,(function*(){if(!e.data)return;const t=JSON.parse(e.data);t.done?(d.close(),n(t)):a(t.data)})))),d.addEventListener("error",(e=>{if(console.info("Error:",e),!e.data)return;const t=JSON.parse(e.data);a(t.data),n(t),d.close()}))}))}finally{this.streamPromise=null}})))()),this.streamPromise}))}requestWithFetch(e,a){return m(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let t=this.accessToken||"",o="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((i,n)=>m(this,void 0,void 0,(function*(){let n=this.ConfigService.getItem("appVersion"),r=this.ConfigService.getItem("appPlatform");var l=new u(this.baseUrl+e.url,{headers:{"Content-Type":"text/plain",Authorization:"Bearer "+t,"X-Request-ID":o,"X-App-Version":n||"1.0.0","X-App-Platform":r||"web"},payload:JSON.stringify(e.data),method:"POST"});l.addEventListener("message",(e=>m(this,void 0,void 0,(function*(){if(!e.data)return;const t=JSON.parse(e.data);t.done?(l.close(),i(t)):a(t.data)})))),l.addEventListener("open",(e=>{console.info(e,"Connection to OpenAI established.")})),l.addEventListener("error",(e=>{if(console.error(e,"Error occurred while connecting to OpenAI"),!e.data)return;const t=JSON.parse(e.data);a(t.data),i(t),l.close()}))}))))}finally{this.streamPromise=null}})))()),this.streamPromise}))}}pe.processingQueue=!1,pe.requestQueue=[];class he extends pe{constructor(e,a,t){super(e,a,t)}getTransStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_trans_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getTransFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_trans_stream",data:e};return yield this.requestWithFetch(t,a)}))}getDictionary(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_dict",data:e};return yield this.requestWithRetry(a)}))}getBatchTrans(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_batch_trans",data:e};return yield this.requestWithRetry(a)}))}getSplitSentence(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_split_sentence",data:e};return yield this.requestWithRetry(a)}))}getAnswerStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_answer_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getAnswerFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_answer_stream",data:e};return yield this.requestWithFetch(t,a)}))}getSummaryStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_sum_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getSummaryFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_sum_stream",data:e};return yield this.requestWithFetch(t,a)}))}getDictionaryStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_dict_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getDictionaryFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_dict_stream",data:e};return yield this.requestWithFetch(t,a)}))}getGoogleFont(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_google_font",data:e};return yield this.requestWithRetry(a)}))}sendToKindle(e,a){return m(this,void 0,void 0,(function*(){let t=new FormData;t.append("file",e.file),t.append("email",e.email),t.append("file_name",e.fileName);const o={method:"post",url:"/api/v1/pro/reader/send_to_kindle",headers:{"Content-Type":"multipart/form-data"},data:t,onUploadProgress:a?t=>{var o;const i=t.total||(null===(o=e.file)||void 0===o?void 0:o.size)||0;i>0&&a(Math.min(t.loaded/i,1))}:void 0};return yield this.requestWithRetry(o)}))}detectLanguage(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/detect_language",data:e};return yield this.requestWithRetry(a)}))}getTTSAudio(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_tts_audio",data:e};return yield this.executeRequest(a)}))}getOcrResult(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_ocr_result",data:e};return yield this.executeRequest(a)}))}getOcrResultV2(e){return m(this,void 0,void 0,(function*(){let a=new FormData;a.append("file",e.file);const t={method:"post",url:"/api/v1/pro/reader/get_ocr_result_v2",headers:{"Content-Type":"multipart/form-data"},data:a};return yield this.executeRequest(t)}))}analyzeText(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/analyze_text",data:e};return yield this.requestWithRetry(a)}))}getBookMetadata(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_book_metadata",data:e};return yield this.requestWithRetry(a)}))}analyzeBookTitle(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/analyze_book_title",data:e};return yield this.requestWithRetry(a)}))}}class ge extends pe{constructor(e,a,t){super(e,a,t),this.serverRegion=t}encryptToken(e){return m(this,void 0,void 0,(function*(){let a=e.token,t=v.encode(a),{extracted:o,remaining:i}=function(e){let a="",t="",o=[],i=1;for(;i<=e.length;)o.push(i-1),i*=2;for(let i=0;i-1){let t=a.split("#");e.encrypted_token=t[1]}const t={method:"post",url:"/api/v1/pro/thirdparty/decrypt_token",data:e};let o=yield this.requestWithRetry(t);if(a.indexOf("#")>-1&&o.data&&o.data.token){let e=a.split("#"),t=function(e,a){let t="",o=[],i=1,n=e.length+a.length;for(;i<=n;)o.push(i-1),i*=2;let r=0,l=0;for(let i=0;i{let o="";if("github"===e?o=`https://github.com/login/oauth/authorize?client_id=${C.githubClientId}&redirect_uri=${t}&scope=${T.github.scopes.join(" ")}&response_type=code`:"google"===e?o=`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${t}&prompt=consent&response_type=code&client_id=${C.googleClientId}&scope=${T.google.scopes.join(" ")}&access_type=offline`:"facebook"===e?o=`https://www.facebook.com/v12.0/dialog/oauth?client_id=${C.facebookClientId}&redirect_uri=${t}&scope=&response_type=code`:"microsoft"===e&&(o=`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${C.microsoftClientId}&scope=${T.microsoft.scopes.join(" ")}&response_type=code&redirect_uri=${t}`),"manual"===a)return o;let i=JSON.stringify({deeplink:"desktop"===a?"koodo-reader://callback":"browser"===a?`${C.callbackUrl}#/login`:"",service:e});return`${o}&state=${"state|"+encodeURIComponent(i)}`}};class Ne{static CompareDatabase(e,a,t){return m(this,void 0,void 0,(function*(){let o=Object.keys(e).filter((e=>e.startsWith("database.sqlite.books"))),i=Object.keys(e).filter((e=>e.startsWith("database.sqlite.notes"))),n=Object.keys(e).filter((e=>e.startsWith("database.sqlite.bookmarks"))),r=Object.keys(e).filter((e=>e.startsWith("database.sqlite.plugins"))),l=Object.keys(e).filter((e=>e.startsWith("database.sqlite.words"))),s=Object.keys(a).filter((e=>e.startsWith("database.sqlite.books"))),d=Object.keys(a).filter((e=>e.startsWith("database.sqlite.notes"))),c=Object.keys(a).filter((e=>e.startsWith("database.sqlite.bookmarks"))),u=Object.keys(a).filter((e=>e.startsWith("database.sqlite.plugins"))),m=Object.keys(a).filter((e=>e.startsWith("database.sqlite.words"))),p={books:Array.from(new Set(o.concat(s))),notes:Array.from(new Set(i.concat(d))),bookmarks:Array.from(new Set(n.concat(c))),plugins:Array.from(new Set(r.concat(u))),words:Array.from(new Set(l.concat(m)))},h={books:{save:[],update:[],delete:[],conflict:[],upload:[]},notes:{save:[],update:[],delete:[],conflict:[],upload:[]},bookmarks:{save:[],update:[],delete:[],conflict:[],upload:[]},plugins:{save:[],update:[],delete:[],conflict:[],upload:[]},words:{save:[],update:[],delete:[],conflict:[],upload:[]}},g=["books","notes","bookmarks","plugins","words"];for(let o of g)for(let i of p[o]){let n=i.split(".")[3],r=e[i],l=a[i];r?l?("save"===l.operation&&("update"!==r.operation&&"delete"!==r.operation||h[o].upload.push(n)),"delete"===l.operation&&("save"===r.operation&&(h[o].delete.push(n),e[i]=l),"update"===r.operation&&(r.timel.time&&(h[o].conflict.push(n),"cloud"===t?(h[o].delete.push(n),e[i]=l):h[o].upload.push(n))),r.operation),"update"===l.operation&&("save"===r.operation&&(h[o].update.push(n),e[i]=l),"update"===r.operation&&(r.timel.time&&h[o].upload.push(n)),"delete"===r.operation&&(r.timel.time&&h[o].upload.push(n)))):h[o].upload.push(n):(h[o].save.push(n),e[i]=l)}return{compareResult:h,syncRecords:e}}))}static CompareConfig(e,a,t){return m(this,void 0,void 0,(function*(){let o=Object.keys(e).filter((e=>e.startsWith("config.readerConfig"))),i=Object.keys(e).filter((e=>e.startsWith("config.listConfig"))),n=Object.keys(e).filter((e=>e.startsWith("config.objectConfig"))),r=Object.keys(e).filter((e=>e.startsWith("config.mapConfig"))),l=Object.keys(a).filter((e=>e.startsWith("config.readerConfig"))),s=Object.keys(a).filter((e=>e.startsWith("config.listConfig"))),d=Object.keys(a).filter((e=>e.startsWith("config.objectConfig"))),c=Object.keys(a).filter((e=>e.startsWith("config.mapConfig"))),u={readerConfig:Array.from(new Set(o.concat(l))),listConfig:Array.from(new Set(i.concat(s))),objectConfig:Array.from(new Set(n.concat(d))),mapConfig:Array.from(new Set(r.concat(c)))},m={readerConfig:{update:[],upload:[]},listConfig:{update:[],upload:[]},objectConfig:{update:[],delete:[],conflict:[],save:[],upload:[]},mapConfig:{update:[],delete:[],conflict:[],save:[],upload:[]}},p=["readerConfig","listConfig"];for(let t of p)for(let o of u[t]){let i=o,n=e[o],r=a[o];n?r?n.timer.time&&m[t].upload.push(i):m[t].upload.push(i):(m[t].update.push(i),e[o]=r)}let h=["objectConfig","mapConfig"];for(let o of h)for(let i of u[o]){let n=i,r=e[i],l=a[i];r?l?("delete"===l.operation&&("update"===r.operation&&(r.timel.time&&(m[o].conflict.push(n),"cloud"===t?(m[o].delete.push(n),e[i]=l):m[o].upload.push(n))),r.operation),"update"===l.operation&&("update"===r.operation&&(r.timel.time&&m[o].upload.push(n)),"delete"===r.operation&&(r.timel.time&&m[o].upload.push(n)))):m[o].upload.push(n):(m[o].update.push(n),e[i]=l)}return{compareResult:m,syncRecords:e}}))}static compareAll(e,a,t,o,i){return m(this,void 0,void 0,(function*(){let n="cloud";if("yes"===t.getReaderConfig("isKeepLocal")){n="local";let e=t.getObjectConfig(yield o.getFingerprint(),"cloudSyncTime",{time:0,conflictMode:"cloud"}),a=yield i.getCloudConfig("config"),r=JSON.parse(a.cloudSyncTime||"{}");delete r[yield o.getFingerprint()],Object.values(r).filter((a=>"local"===a.conflictMode&&a.time>e.time)).length>0&&(n="cloud")}let{compareResult:r,syncRecords:l}=yield this.CompareDatabase(e,a,n),{compareResult:s,syncRecords:d}=yield this.CompareConfig(l,a,n),c=Object.assign(Object.assign({},r),s);return t.setAllSyncRecord(d),"local"===n&&(c.books.conflict.length>0||c.notes.conflict.length>0||c.bookmarks.conflict.length>0||c.plugins.conflict.length>0||c.words.conflict.length>0||c.objectConfig.conflict.length>0||c.mapConfig.conflict.length>0)?t.setObjectConfig(yield o.getFingerprint(),{time:(new Date).getTime(),conflictMode:"local"},"cloudSyncTime"):t.setObjectConfig(yield o.getFingerprint(),{time:(new Date).getTime(),conflictMode:"cloud"},"cloudSyncTime"),c}))}static startSync(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){let r=yield this.syncConfig(e,a,t,i,n,o);if(e.books.save.length>0||e.books.upload.length>0){let e=yield this.syncCover(a,n,i),t=yield this.syncBook(a,i);return[...r,...e,...t]}return r}))}static syncConfig(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){let r=[];for(let a of h){if(e[a].save.length+e[a].update.length>0){let o=yield n.getCloudDatabase(a);for(let i of e[a].save){let e=o.find((e=>e.key===i));e&&(yield t.saveRecord(e,a))}for(let i of e[a].update){let e=o.find((e=>e.key===i));e&&(yield t.updateRecord(e,a,!1))}}if(e[a].delete.length>0)for(let n of e[a].delete)"books"===a&&(yield o.deleteOfflineBook(n),yield i.deleteOfflineCover(n)),yield t.deleteRecord(n,a);yield t.dumpDatabase(a,!0)}if(e.readerConfig.update.length>0||e.listConfig.update.length>0||e.objectConfig.update.length>0||e.mapConfig.update.length>0){let t=yield n.getCloudConfig("config");for(let o of e.readerConfig.update){let e=o.split(".")[3];t.readerConfig&&a.setReaderConfig(e,JSON.parse(t.readerConfig)[e],!1)}for(let o of e.listConfig.update){let e=o.split(".")[3];t[e]&&a.setAllListConfig(JSON.parse(t[e]),e,!1)}for(let o of e.objectConfig.update){let e=o.split(".")[3],i=o.split(".")[2];t[i]&&JSON.parse(t[i])&&JSON.parse(t[i])[e]&&a.setObjectConfig(e,JSON.parse(t[i])[e],i,!1)}for(let o of e.mapConfig.update){let e=o.split(".")[3],i=o.split(".")[2];if(t[i]&&JSON.parse(t[i])&&JSON.parse(t[i])[e]){let o=JSON.parse(t[i])[e];a.setOneMapConfig(e,o,i,!1)}}}if(e.objectConfig.delete.length>0||e.mapConfig.delete.length>0){for(let t of e.objectConfig.delete){let e=t.split(".")[3],o=t.split(".")[2];a.deleteObjectConfig(e,o)}for(let t of e.mapConfig.delete){let e=t.split(".")[3],o=t.split(".")[2];a.deleteMapConfig(e,o)}}for(let a of h)e[a].upload.length>0&&r.push((()=>n.uploadDatabase(a)));return r.push((()=>n.uploadConfig("config"))),r.push((()=>n.uploadConfig("sync"))),r}))}static syncCover(e,a,t){return m(this,void 0,void 0,(function*(){let t=yield a.getLocalCoverList(),o=yield a.getCloudCoverList(),i=Array.from(new Set([...t,...o])),n=[];for(let r of i)t.includes(r)&&!o.includes(r)&&n.push((()=>a.uploadCover(r))),!t.includes(r)&&o.includes(r)&&"adrive"!==e.getItem("defaultSyncOption")&&n.push((()=>a.downloadCover(r)));return n}))}static syncBook(e,a){return m(this,void 0,void 0,(function*(){let t=yield a.getLocalBookList(),o=yield a.getCloudBookList(),i=[],n=Array.from(new Set([...t,...o]));for(let r of n){if(t.includes(r)&&!o.includes(r)){let e=r.split(".")[0],t=r.split(".")[1];i.push((()=>a.uploadBook(e,t)))}let n="yes"===e.getReaderConfig("autoOffline");if(!t.includes(r)&&o.includes(r)&&n&&"adrive"!==e.getItem("defaultSyncOption")){let e=r.split(".")[0],t=r.split(".")[1]||"epub";i.push((()=>a.offlineBook(e,t.toUpperCase())))}}return i}))}static runTasksWithLimit(e,a,t){return m(this,void 0,void 0,(function*(){if("ftp"!==t&&"adrive"!==t){const t=[],o=[];for(const i of e){const e=i().then((a=>(o.splice(o.indexOf(e),1),a)));t.push(e),o.push(e),o.length>=a&&(yield Promise.race(o))}return Promise.all(t)}for(let a of e)yield a()}))}}class ve{constructor(e,a){this.bookKey="",this.sessionStart=0,this.unregisterUnload=null,this.configService=e,this.platform=a}getDailySeconds(e,a){const t=((this.configService.getAllMapConfig("readingStats")||{})[a]||[]).find((a=>a.startsWith(e+"-")));if(!t)return 0;const o=t.split("-");return parseInt(o[o.length-1],10)||0}setDailySeconds(e,a,t){const o=(this.configService.getAllMapConfig("readingStats")||{})[a]||[],i=`${e}-${t}`,n=o.filter((a=>!a.startsWith(e+"-")));this.configService.setOneMapConfig(a,[...n,i],"readingStats")}start(e){this.bookKey=e,this.sessionStart=Date.now(),this.unregisterUnload=this.platform.registerUnloadHandler((()=>{var e,a;this.commit(),null===(a=(e=this.platform).onBeforeClose)||void 0===a||a.call(e)}))}stop(){var e;this.commit(),null===(e=this.unregisterUnload)||void 0===e||e.call(this),this.unregisterUnload=null,this.bookKey="",this.sessionStart=0}commit(){if(!this.bookKey||!this.sessionStart)return;const e=Date.now()-this.sessionStart;if(e<1e3)return void(this.sessionStart=0);const a=Math.round(e/1e3);this.sessionStart=0;const t=this.configService.getObjectConfig(this.bookKey,"readingTime",0);this.configService.setObjectConfig(this.bookKey,t+a,"readingTime");const o=function(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}(),i=this.getDailySeconds(this.bookKey,o);this.setDailySeconds(this.bookKey,o,i+a)}getTotalSeconds(e){return this.configService.getObjectConfig(e,"readingTime",0)}getDailySecondsForBook(e,a){return this.getDailySeconds(e,a)}getDayStats(e){return((this.configService.getAllMapConfig("readingStats")||{})[e]||[]).map((e=>{const a=e.lastIndexOf("-");return{bookKey:e.substring(0,a),seconds:parseInt(e.substring(a+1),10)||0}}))}getAllDates(){const e=this.configService.getAllMapConfig("readingStats");return Object.keys(e||{})}}const be="Koodo Reader",ke="application/vnd.koreader.v1+json";class Se extends Error{constructor(e,a,t,o){super(e),this.name="KOReaderRequestError",this.status=a,this.code=t,this.body=o}}const Ee=e=>{const a=(e||"").trim();if(!a)return"";return(/^https?:\/\//i.test(a)?a:`https://${a}`).replace(/\/+$/,"")},Ce=e=>{const a="number"==typeof e?e:parseFloat((e||"0")+"");return!isFinite(a)||isNaN(a)?0:a>1&&a<=100?Math.min(Math.max(a/100,0),1):Math.min(Math.max(a,0),1)},Te=(e,a={})=>m(void 0,void 0,void 0,(function*(){const t=yield fetch(e,a);return t.ok||(yield(e=>m(void 0,void 0,void 0,(function*(){let a=null;try{a=yield e.json()}catch(t){try{a=yield e.text()}catch(e){a=null}}const t=(null==a?void 0:a.message)||(null==a?void 0:a.error)||(null==a?void 0:a.msg)||("string"==typeof a?a:"")||e.statusText||"Request failed";throw console.error(`[KOReader] HTTP ${e.status} error: ${t}`,null!=a?a:"(no body)"),new Se(t,e.status,null==a?void 0:a.code,a)})))(t)),204===t.status?{}:yield t.json()})),we=e=>({Accept:ke,"Content-Type":"application/json","x-auth-user":e.username,"x-auth-key":e.passwordHash});class Ae{constructor(e,a,t){this.getKOReaderSyncConfig=()=>{let e;try{e=this.ConfigService.getObjectConfig("koReaderSyncConfig","thirdpartyToken",{})}catch(e){return console.error("[KOReader] Failed to read koReaderSyncConfig:",e),null}if(!e||"object"!=typeof e)return console.error("[KOReader] koReaderSyncConfig is missing or invalid"),null;const a=Ee(e.serverUrl||""),t=(e.username||"").trim(),o=(e.passwordHash||"").trim();return a&&t&&o?{serverUrl:a,username:t,passwordHash:o}:(console.error("[KOReader] Incomplete config — missing fields"),null)},this.getLocalRecordLocation=e=>this.ConfigService.getObjectConfig(e,"recordLocation",{})||{},this.persistKOReaderMetadata=(e,a,t)=>{const o=Object.assign(Object.assign({},a),{percentage:t.percentage.toString(),xpath:t.progress,timestamp:t.timestamp||parseInt(Date.now()/1e3+"")});this.ConfigService.setObjectConfig(e,o,"recordLocation")},this.authUser=e=>m(this,void 0,void 0,(function*(){return yield Te(`${e.serverUrl}/users/auth`,{method:"GET",headers:we(e)})})),this.createUser=e=>m(this,void 0,void 0,(function*(){return yield Te(`${e.serverUrl}/users/create`,{method:"POST",headers:{Accept:ke,"Content-Type":"application/json"},body:JSON.stringify({username:e.username,password:e.passwordHash})})})),this.getBookProgress=(e,a)=>m(this,void 0,void 0,(function*(){const t=yield Te(`${e.serverUrl}/syncs/progress/${encodeURIComponent(a)}`,{method:"GET",headers:we(e)});return t&&0!==Object.keys(t).length?{document:a,percentage:Ce(t.percentage),progress:t.progress||"",device:t.device||"",device_id:t.device_id||"",timestamp:t.timestamp||0}:null})),this.updateBookProgress=(e,a)=>m(this,void 0,void 0,(function*(){yield Te(`${e.serverUrl}/syncs/progress`,{method:"PUT",headers:we(e),body:JSON.stringify({document:a.document,percentage:a.percentage,progress:a.progress,device:a.device||be,device_id:a.device_id||"",timestamp:a.timestamp||parseInt(Date.now()/1e3+"")})})})),this.buildLocalUploadPayload=(e,a,t,o)=>m(this,void 0,void 0,(function*(){const i=Ce(a.percentage),n=a.xpath||"",r=this.ConfigService.getObjectConfig(e.key,"koreaderBooks",{});if(!r.document){let a=yield o(e);if(!a)return console.error(`[KOReader] Cannot build upload payload for "${e.name}": failed to compute partial MD5`),null;r.document=a,this.ConfigService.setObjectConfig(e.key,r,"koreaderBooks")}return n?{document:r.document,percentage:i,progress:n,device:be,device_id:t,timestamp:a.timestamp||parseInt(Date.now()/1e3+"")}:(console.error(`[KOReader] Cannot build upload payload for "${e.name}": no xpath/progress recorded (localRecord.xpath is empty)`),null)})),this.resolveDeviceId=()=>m(this,void 0,void 0,(function*(){try{return(yield this.TokenService.getFingerprint())||"koodo-reader"}catch(e){return console.error("[KOReader] Failed to get device fingerprint, using fallback ID:",e),"koodo-reader"}})),this.verifyAndBuildKOReaderSyncConfig=e=>m(this,void 0,void 0,(function*(){const a={serverUrl:Ee(e.serverUrl),username:(e.username||"").trim(),passwordHash:(e.password||"").trim()?s.MD5((e.password||"").trim()).toString():(e.passwordHash||"").trim()};if(!a.serverUrl||!a.username||!a.passwordHash)throw new Error("Please fill in all fields");try{return yield this.authUser(a),a}catch(e){console.error(`[KOReader] Auth failed for user "${a.username}" at ${a.serverUrl}, attempting to create user:`,e);try{return yield this.createUser(a),yield this.authUser(a),a}catch(o){if((t=o)instanceof Se&&(2002===t.code||(t.message||"").toLowerCase().includes("already exists")))throw console.error(`[KOReader] User "${a.username}" already exists but auth failed. Original auth error:`,e),e;throw console.error(`[KOReader] Failed to create user "${a.username}":`,o),o}}var t})),this.syncKOReaderProgress=e=>m(this,void 0,void 0,(function*(){const a=this.getKOReaderSyncConfig();if(!a)throw new Error("Please configure the KOReader sync server first");yield this.authUser(a);const t=yield this.resolveDeviceId(),o=(yield this.DatabaseService.getAllRecords("books"))||[],i={checkedBooks:0,matchedBooks:0,pulledBooks:0,pushedBooks:0,skippedBooks:0};for(const n of o)try{i.checkedBooks++;const o=this.getLocalRecordLocation(n.key);if(!o||!o.xpath){console.error(`[KOReader] Skipping "${n.name}": no local reading progress (xpath) found`),i.skippedBooks++;continue}const r=this.ConfigService.getObjectConfig(n.key,"koreaderBooks",{});if(!r.document){let a=yield e(n);if(!a){console.error(`[KOReader] Skipping "${n.name}": failed to compute partial MD5 for document ID`),i.skippedBooks++;continue}r.document=a,this.ConfigService.setObjectConfig(n.key,r,"koreaderBooks")}let l=r.document;const s=yield this.getBookProgress(a,l),d=(null==s?void 0:s.timestamp)||0,c=o.timestamp||0;if(s){if(i.matchedBooks++,d>c)this.persistKOReaderMetadata(n.key,o,s),i.pulledBooks++;else{if(!(d{if("number"!=typeof e){const[a,t]=e.split("-");return{styleType:a,color:t}}if(e>=0&&e-1,t=parseInt(xe[e].split("-")[1]);return{styleType:a?"background":"underline",color:a?Ie[t]:Fe[t]}}return{styleType:"background",color:"#FEF3CD"}},this.formatHighlightValue=e=>`${e.styleType}-${e.color}`,this.getNoteHighlightString=()=>this.ConfigService.getReaderConfig(Me)||"background-#FEF3CD",this.getNoteHighlightValue=()=>{const e=this.getNoteHighlightString();if(!e)return Ue;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveNoteHighlightValue=e=>{this.ConfigService.setReaderConfig(Me,`${e.styleType}-${e.color}`)},this.getTtsHighlightString=()=>this.ConfigService.getReaderConfig(_e)||Re,this.getTtsHighlightValue=()=>{const e=this.getTtsHighlightString();if(!e)return Oe;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveTtsHighlightValue=e=>{this.ConfigService.setReaderConfig(_e,`${e.styleType}-${e.color}`)},this.getSearchHighlightString=()=>this.ConfigService.getReaderConfig($e)||Re,this.getSearchHighlightValue=()=>{const e=this.ConfigService.getReaderConfig($e);if(!e)return Oe;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveSearchHighlightValue=e=>{this.ConfigService.setReaderConfig($e,`${e.styleType}-${e.color}`)},this.buildHighlightStyleForType=(e,a,t)=>{let o="background",i="#FEF3CD";if("number"==typeof e){if(e>=0&&e-1,t=parseInt(xe[e].split("-")[1]);o=a?"background":"underline",i=a?Ie[t]:Fe[t]}}else o=e.split("-")[0],i=e.split("-")[1];const n="background"===o?((e,a)=>{const t=e.replace("#",""),o=3===t.length?t.split("").map((e=>e+e)).join(""):t;return 6!==o.length?e:`rgba(${parseInt(o.slice(0,2),16)}, ${parseInt(o.slice(2,4),16)}, ${parseInt(o.slice(4,6),16)}, ${a})`})(i,.8):i;switch(o){case"background":return a?`background: ${n}; mix-blend-mode: multiply;`:`background: ${n};`;case"underline":return a?t?`border-right: 2px solid ${n};`:`border-bottom: 2px solid ${n};`:`text-decoration: underline; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return a?`background: linear-gradient(transparent calc(50% - 1px), ${n} calc(50% - 1px), ${n} calc(50% + 1px), transparent calc(50% + 1px));`:t?`background: linear-gradient(to right, transparent calc(50% - 1px), ${n} calc(50% - 1px), ${n} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const e=i.replace("#","%23");if(a){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${e}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(t){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${e}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${n};`}},this.buildHighlightPreviewStyle=(e,a)=>{switch(e){case"background":default:return{background:a};case"underline":return{textDecoration:"underline",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"};case"strikethrough":return{textDecoration:"line-through",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"};case"wavy":return{textDecorationLine:"underline",textDecorationStyle:"wavy",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"}}},this.convertNumberToHighlightValue=e=>this.getHighlightValue(e),this.buildTtsHighlightStyle=(e,a)=>this.buildHighlightStyleForType(this.getTtsHighlightString(),e,a),this.buildTtsHighlightPreviewStyle=(e,a)=>this.buildHighlightPreviewStyle(e,a),this.buildSearchHighlightStyle=(e,a)=>this.buildHighlightStyleForType(this.getSearchHighlightString(),e,a),this.buildSearchHighlightPreviewStyle=(e,a)=>this.buildHighlightPreviewStyle(e,a),this.ConfigService=e}}const ze=(De=class{static getItem(e){return localStorage.getItem(e)}static setItem(e,a){localStorage.setItem(e,a)}static removeItem(e){localStorage.removeItem(e)}},Le="browser",class extends De{static getReaderConfig(e){return w.includes(e)&&"undefined"!=typeof window&&window.currentBookKey&&this.getAllListConfig("seperateStyleBooks").includes(window.currentBookKey)?this.getObjectConfig(window.currentBookKey,"seperateStyleConfig",{})[e]:JSON.parse(this.getItem("readerConfig")||"{}")[e]}static setReaderConfig(e,a,t=!0){if(w.includes(e)&&"undefined"!=typeof window&&window.currentBookKey&&this.getAllListConfig("seperateStyleBooks").includes(window.currentBookKey)){let o=this.getObjectConfig(window.currentBookKey,"seperateStyleConfig",{});return o[e]=a,void this.setObjectConfig(window.currentBookKey,o,"seperateStyleConfig",t)}let o=JSON.parse(this.getItem("readerConfig")||"{}");o[e]=a,this.setItem("readerConfig",JSON.stringify(o)),t&&this.setSyncRecord({type:"config",catergory:"readerConfig",name:Le,key:e},{operation:"update",time:Date.now()})}static getAllListConfig(e){return("{}"!==this.getItem(e)&&this.getItem(e)?JSON.parse(this.getItem(e)||""):[])||[]}static deleteListConfig(e,a){let t=this.getAllListConfig(a);const o=t.indexOf(e);o>-1&&t.splice(o,1),this.setAllListConfig(t,a)}static setListConfig(e,a){let t=this.getAllListConfig(a);const o=t.indexOf(e);o>-1?(t.splice(o,1),t.unshift(e)):t.unshift(e),this.setAllListConfig(t,a)}static setAllListConfig(e,a,t=!0){this.setItem(a,JSON.stringify(e)),t&&this.setSyncRecord({type:"config",catergory:"listConfig",name:"general",key:a},{operation:"update",time:Date.now()})}static setObjectConfig(e,a,t,o=!0){let i=this.getAllObjectConfig(t);i[e]=a,o&&this.setSyncRecord({type:"config",catergory:"objectConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllObjectConfig(i,t)}static getObjectConfig(e,a,t){return this.getAllObjectConfig(a)[e]||t}static getAllObjectConfig(e){let a=this.getItem(e);return JSON.parse(a)||{}}static setAllObjectConfig(e,a){this.setItem(a,JSON.stringify(e))}static deleteObjectConfig(e,a){let t=this.getAllObjectConfig(a);delete t[e],this.setSyncRecord({type:"config",catergory:"objectConfig",name:a,key:e},{operation:"delete",time:Date.now()}),this.setAllObjectConfig(t,a)}static getAllMapConfig(e){let a=this.getItem(e);return JSON.parse(a)||{}}static getMapConfig(e,a){return this.getAllMapConfig(a)[e]||[]}static setAllMapConfig(e,a){this.setItem(a,JSON.stringify(e))}static setMapConfig(e,a,t){let o=this.getAllMapConfig(t);void 0===o[e]&&(o[e]=[]),a&&-1===o[e].indexOf(a)&&o[e].unshift(a),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,t)}static setOneMapConfig(e,a,t,o=!0){let i=this.getAllMapConfig(t);i[e]=a,o&&this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(i,t)}static deleteFromMapConfig(e,a,t){let o=this.getAllMapConfig(t),i=o[e].indexOf(a);o[e].splice(i,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,t)}static deleteFromAllMapConfig(e,a){let t=this.getAllMapConfig(a);Object.keys(t).forEach((o=>{let i=t[o].indexOf(e);i>-1&&(t[o].splice(i,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:a,key:o},{operation:"update",time:Date.now()}))})),this.setAllMapConfig(t,a)}static deleteMapConfig(e,a){let t=this.getAllMapConfig(a);delete t[e],this.setSyncRecord({type:"config",catergory:"mapConfig",name:a,key:e},{operation:"delete",time:Date.now()}),this.setAllMapConfig(t,a)}static getFromAllMapConfig(e,a){let t=this.getAllMapConfig(a),o=[];for(let a in t)t[a]&&t[a].indexOf(e)>-1&&o.push(a);return o}static getSyncRecord(e){return JSON.parse(this.getItem("syncRecord")||"{}")[e.type+"."+e.catergory+"."+e.name+"."+e.key]||{operation:"",time:0}}static getAllSyncRecord(){return JSON.parse(this.getItem("syncRecord")||"{}")}static setSyncRecord(e,a){const t=e.type+"."+e.catergory+"."+e.name+"."+e.key;let o=JSON.parse(this.getItem("syncRecord")||"{}");o[t]=a,this.setItem("syncRecord",JSON.stringify(o))}static setAllSyncRecord(e){this.setItem("syncRecord",JSON.stringify(e))}});var De,Le;class Pe{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("notionSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Notion] notionSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Notion] Failed to read notionSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableNotionSync")}resolveDatabaseId(e,a){return m(this,void 0,void 0,(function*(){const t=yield fetch(`https://api.notion.com/v1/blocks/${a}/children`,{method:"GET",headers:{Authorization:`Bearer ${e}`,"Notion-Version":"2022-06-28"}});if(!t.ok){const e=yield t.json().catch((()=>null));throw console.error(`[Notion] resolveDatabaseId failed for page ${a}: HTTP ${t.status} ${t.statusText}`,JSON.stringify(e)),new Error(`Notion resolve database error: ${t.status} ${t.statusText}`)}const o=yield t.json(),i=(o.results||[]).find((e=>"child_database"===e.type));if(!i)throw console.error(`[Notion] No child_database block found under page ${a}. Available block types:`,JSON.stringify((o.results||[]).map((e=>e.type)))),new Error(`No child database found in page ${a}. Please provide a Database ID directly.`);return i.id}))}findOrCreatePage(e,a,t){return m(this,void 0,void 0,(function*(){const o=`${t}`,i=yield fetch(`https://api.notion.com/v1/databases/${a}/query`,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({filter:{property:"title",title:{equals:o}}})});if(!i.ok){const o=yield i.json().catch((()=>({})));if(400===i.status&&"validation_error"===(null==o?void 0:o.code)&&"string"==typeof(null==o?void 0:o.message)&&o.message.includes("is a page, not a database")){console.error(`[Notion] Provided databaseId "${a}" is a page, not a database. Resolving child database...`);const o=yield this.resolveDatabaseId(e,a);return this.findOrCreatePage(e,o,t)}throw console.error(`[Notion] Database query failed for databaseId "${a}" (book: "${t}"): HTTP ${i.status} ${i.statusText}`,JSON.stringify(o)),new Error(`Notion API error: ${i.status} ${i.statusText}`)}const n=yield i.json();if(n.results&&n.results.length>0)return n.results[0].id;const r=yield fetch("https://api.notion.com/v1/pages",{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({parent:{database_id:a},properties:{title:{title:[{text:{content:o}}]}}})});if(!r.ok){const e=yield r.json().catch((()=>null));throw console.error(`[Notion] Failed to create page for book "${t}" in database "${a}": HTTP ${r.status} ${r.statusText}`,JSON.stringify(e)),new Error(`Notion create page error: ${r.status} ${r.statusText}`)}return(yield r.json()).id}))}appendBlocks(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=!t.notes||0===t.notes.length,n=[];n.push({object:"block",type:"divider",divider:{}}),o&&n.push({object:"block",type:"heading_3",heading_3:{rich_text:[{type:"text",text:{content:o}}]}}),n.push({object:"block",type:"quote",quote:{rich_text:[{type:"text",text:{content:t.text||""}}]}}),!i&&t.notes&&n.push({object:"block",type:"paragraph",paragraph:{rich_text:[{type:"text",text:{content:`📝 ${t.notes}`}}]}});const r=`${t.date.year}-${String(t.date.month).padStart(2,"0")}-${String(t.date.day).padStart(2,"0")}`;n.push({object:"block",type:"paragraph",paragraph:{rich_text:[{type:"text",text:{content:`Added on ${r}`},annotations:{italic:!0,color:"gray"}}]}});const l=yield fetch(`https://api.notion.com/v1/blocks/${a}/children`,{method:"PATCH",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({children:n})});if(!l.ok){const e=yield l.json().catch((()=>null));throw console.error(`[Notion] Failed to append blocks to page ${a}: HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),new Error(`Notion append blocks error: ${l.status} ${l.statusText}`)}}))}syncNote(e,a){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const t=this.getConfig();if(!t)return!1;try{const o=yield this.findOrCreatePage(t.token,t.databaseId,a);return yield this.appendBlocks(t.token,o,e,e.chapter||""),!0}catch(e){return console.error(`[Notion] Sync failed for book "${a}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class je{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("yuqueSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Yuque] yuqueSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Yuque] Failed to read yuqueSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableYuqueSync")}generateDocSlug(e){return m(this,void 0,void 0,(function*(){const a=(e||"").trim()||"untitled",t=a.toLowerCase().replace(/[^a-z0-9_.-]/g,"-").replace(/[-_.]{2,}/g,"-").replace(/^[-_.]+|[-_.]+$/g,"")||"book",o=(yield y(a)).slice(0,16),i=t,n=190-o.length-1;return`${i.substring(0,n).replace(/^[-_.]+|[-_.]+$/g,"")||"book"}-${o}`}))}findOrCreateDoc(e,a,t){return m(this,void 0,void 0,(function*(){const o=`${t}`,i=yield this.generateDocSlug(t);try{const t=yield fetch(`${je.API_BASE}/repos/${a}/docs/${i}`,{method:"GET",headers:{"X-Auth-Token":e,"Content-Type":"application/json"}});if(t.ok){const e=yield t.json();return{id:e.data.id,slug:e.data.slug,body:e.data.body||""}}if(404!==t.status){const e=yield t.json().catch((()=>null));console.error(`[Yuque] Unexpected error fetching doc "${i}" in repo "${a}": HTTP ${t.status} ${t.statusText}`,JSON.stringify(e))}}catch(e){console.error(`[Yuque] Network error fetching doc "${i}" in repo "${a}":`,JSON.stringify(e))}const n=yield fetch(`${je.API_BASE}/repos/${a}/docs`,{method:"POST",headers:{"X-Auth-Token":e,"Content-Type":"application/json"},body:JSON.stringify({title:o,slug:i,body:`# ${o}\n\n`,format:"markdown"})});if(!n.ok){const e=yield n.json().catch((()=>null));throw console.error(`[Yuque] Failed to create doc "${o}" in repo "${a}": HTTP ${n.status} ${n.statusText}`,JSON.stringify(e)),new Error(`Yuque create doc error: ${n.status} ${n.statusText}`)}const r=yield n.json();return{id:r.data.id,slug:r.data.slug,body:r.data.body||""}}))}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="\n---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}updateDoc(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${je.API_BASE}/repos/${a}/docs/${t}`,{method:"PUT",headers:{"X-Auth-Token":e,"Content-Type":"application/json"},body:JSON.stringify({body:o,format:"markdown"})});if(!i.ok){const e=yield i.json().catch((()=>null));throw console.error(`[Yuque] Failed to update doc ${t} in repo "${a}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),new Error(`Yuque update doc error: ${i.status} ${i.statusText}`)}}))}syncNote(e,a){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const t=this.getConfig();if(!t)return!1;try{const o=yield this.findOrCreateDoc(t.token,t.namespace,a),i=this.formatNoteMarkdown(e),n=o.body+i;return yield this.updateDoc(t.token,t.namespace,o.id,n),!0}catch(e){return console.error(`[Yuque] Sync failed for book "${a}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}je.API_BASE="https://www.yuque.com/api/v2";class Ke{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("readwiseSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Readwise] readwiseSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Readwise] Failed to read readwiseSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableReadwiseSync")}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=`${a}`,n=!e.notes||0===e.notes.length,r={text:e.text||"",title:i,author:t||"Unknown",source_type:"koodo-reader",category:"books",highlighted_at:`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`};if(!n&&e.notes&&(r.note=e.notes),e.chapter){const a=parseInt(e.chapter,10);isNaN(a)||(r.location_type="order",r.location=a)}try{const e=yield fetch(`${Ke.API_BASE}/highlights/`,{method:"POST",headers:{Authorization:`Token ${o.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({highlights:[r]})});if(!e.ok){const a=yield e.json().catch((()=>null));throw console.error(`[Readwise] Failed to sync highlight for book "${i}": HTTP ${e.status} ${e.statusText}`,JSON.stringify(a)),new Error(`Readwise API error: ${e.status} ${e.statusText}`)}return!0}catch(a){return console.error(`[Readwise] Sync failed for book "${i}" (text: "${(e.text||"").substring(0,50)}..."):`,JSON.stringify(a instanceof Error?a.message:a)),!1}}))}}Ke.API_BASE="https://readwise.io/api/v2";class He{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("imaSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[IMA] imaSyncConfig is empty or not set"),null):e}catch(e){return console.error("[IMA] Failed to read imaSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableImaSync")}getHeaders(e){return{"Content-Type":"application/json","ima-openapi-clientid":e.clientId,"ima-openapi-apikey":e.apiKey}}formatNoteMarkdown(e,a,t){const o=!e.notes||0===e.notes.length,i=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let n="\n---\n\n";return e.chapter&&(n+=`### ${e.chapter}\n\n`),n+=`> ${e.text||""}\n\n`,!o&&e.notes&&(n+=`**Note:** ${e.notes}\n\n`),n+=`*${i}*\n`,n}findNoteByTitle(e,a){var t,o,i,n;return m(this,void 0,void 0,(function*(){try{const r=JSON.stringify({search_type:0,query_info:{title:a},start:0,end:20}),l=yield fetch(`${He.API_BASE}/search_note`,{method:"POST",headers:this.getHeaders(e),body:r});if(!l.ok){const e=yield l.json().catch((()=>null));return console.error(`[IMA] search_note failed for title "${a}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),null}const s=yield l.json();if(0!==s.code)return console.error(`[IMA] search_note returned error code ${s.code} for title "${a}":`,JSON.stringify(null!==(t=s.msg)&&void 0!==t?t:s)),null;const d=((null===(o=s.data)||void 0===o?void 0:o.search_note_infos)||[]).find((e=>{var t;return a.includes(null===(t=e.note_book_info)||void 0===t?void 0:t.title.replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu,""))}));return null!==(n=null===(i=null==d?void 0:d.note_book_info)||void 0===i?void 0:i.note_id)&&void 0!==n?n:null}catch(e){return console.error(`[IMA] Network error in search_note for title "${a}":`,JSON.stringify(e)),null}}))}createNote(e,a,t){var o,i,n;return m(this,void 0,void 0,(function*(){try{const r={content_format:1,content:`# ${a}\n\n${t}`};e.folderId&&(r.folder_id=e.folderId);const l=yield fetch(`${He.API_BASE}/import_doc`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify(r)});if(!l.ok){const e=yield l.json().catch((()=>null));return console.error(`[IMA] import_doc failed for note "${a}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),null}const s=yield l.json();return 0!==s.code?(console.error(`[IMA] import_doc returned error code ${s.code} for note "${a}":`,JSON.stringify(null!==(o=s.msg)&&void 0!==o?o:s)),null):null!==(n=null===(i=s.data)||void 0===i?void 0:i.note_id)&&void 0!==n?n:null}catch(e){return console.error(`[IMA] Network error in import_doc for note "${a}":`,JSON.stringify(e)),null}}))}appendNote(e,a,t){var o;return m(this,void 0,void 0,(function*(){try{const i=yield fetch(`${He.API_BASE}/append_doc`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify({note_id:a,content_format:1,content:t})});if(!i.ok){const e=yield i.json().catch((()=>null));return console.error(`[IMA] append_doc failed for noteId "${a}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),!1}const n=yield i.json();return 0===n.code||(console.error(`[IMA] append_doc returned error code ${n.code} for noteId "${a}":`,JSON.stringify(null!==(o=n.msg)&&void 0!==o?o:n)),!1)}catch(e){return console.error(`[IMA] Network error in append_doc for noteId "${a}":`,JSON.stringify(e)),!1}}))}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=this.formatNoteMarkdown(e,a,t);let n=yield this.findNoteByTitle(o,a);if(n){const e=yield this.appendNote(o,n,i);return e||console.error(`[IMA] Failed to append to existing note "${a}" (noteId: ${n})`),e}return n=yield this.createNote(o,a,i),n||console.error(`[IMA] Failed to create note for book "${a}"`),null!==n}))}}He.API_BASE="https://ima.qq.com/openapi/note/v1";class Je{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("siyuanSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[SiYuan] siyuanSyncConfig is empty or not set"),null):e}catch(e){return console.error("[SiYuan] Failed to read siyuanSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableSiYuanSync")}getHeaders(e){return{"Content-Type":"application/json",Authorization:`Token ${e}`}}findOrCreateNotebook(e,a){var t,o;return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/notebook/lsNotebooks`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({})});if(!i.ok){const a=yield i.json().catch((()=>null));throw console.error(`[SiYuan] lsNotebooks failed at ${e}: HTTP ${i.status} ${i.statusText}`,JSON.stringify(a)),new Error(`SiYuan list notebooks failed: ${i.status} ${i.statusText}`)}const n=yield i.json();if(0!==n.code)throw console.error(`[SiYuan] lsNotebooks returned error code ${n.code}:`,JSON.stringify(n.msg)),new Error(`SiYuan list notebooks error: ${n.msg}`);const r=(null!==(o=null===(t=n.data)||void 0===t?void 0:t.notebooks)&&void 0!==o?o:[]).find((e=>"Koodo Reader"===e.name));if(r)return r.id;const l=yield fetch(`${e}/api/notebook/createNotebook`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({name:"Koodo Reader"})});if(!l.ok){const a=yield l.json().catch((()=>null));throw console.error(`[SiYuan] createNotebook failed at ${e}: HTTP ${l.status} ${l.statusText}`,JSON.stringify(a)),new Error(`SiYuan create notebook failed: ${l.status} ${l.statusText}`)}const s=yield l.json();if(0!==s.code)throw console.error(`[SiYuan] createNotebook returned error code ${s.code}:`,JSON.stringify(s.msg)),new Error(`SiYuan create notebook error: ${s.msg}`);return s.data.notebook.id}))}findOrCreateDoc(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/query/sql`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({stmt:`SELECT id FROM blocks WHERE type='d' AND hpath='${o.replace(/'/g,"''")}' LIMIT 1`})});if(i.ok){const e=yield i.json();if(0!==e.code)console.error(`[SiYuan] SQL query for doc "${o}" returned error code ${e.code}:`,JSON.stringify(e.msg));else if(e.data&&e.data.length>0)return e.data[0].id}else{const e=yield i.json().catch((()=>null));console.error(`[SiYuan] SQL query for doc "${o}" failed: HTTP ${i.status} ${i.statusText}`,JSON.stringify(e))}const r=n?`**Author:** ${n}\n`:"",l=yield fetch(`${e}/api/filetree/createDocWithMd`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({notebook:t,path:o,markdown:r})});if(!l.ok){const e=yield l.json().catch((()=>null));throw console.error(`[SiYuan] createDocWithMd failed for "${o}" in notebook "${t}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),new Error(`SiYuan create doc failed: ${l.status} ${l.statusText}`)}const s=yield l.json();if(0!==s.code)throw console.error(`[SiYuan] createDocWithMd returned error code ${s.code} for "${o}":`,JSON.stringify(s.msg)),new Error(`SiYuan create doc error: ${s.msg}`);return s.data}))}appendMarkdownToDoc(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/block/appendBlock`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({data:o,dataType:"markdown",parentID:t})});if(!i.ok){const e=yield i.json().catch((()=>null));throw console.error(`[SiYuan] appendBlock failed for docId "${t}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),new Error(`SiYuan append block failed: ${i.status} ${i.statusText}`)}const n=yield i.json();if(0!==n.code)throw console.error(`[SiYuan] appendBlock returned error code ${n.code} for docId "${t}":`,JSON.stringify(n.msg)),new Error(`SiYuan append block error: ${n.msg}`)}))}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}sanitizePathComponent(e){return e.replace(/[\\/:*?"<>|]/g,"_").trim()}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const{serverUrl:i,token:n}=o;if(!i||!n)return console.error("[SiYuan] Sync skipped: config is missing serverUrl or token",JSON.stringify({hasServerUrl:!!i,hasToken:!!n})),!1;try{const o=yield this.findOrCreateNotebook(i,n),r=`/${this.sanitizePathComponent(a)}`,l=yield this.findOrCreateDoc(i,n,o,r,a,t),s=this.formatNoteMarkdown(e);return yield this.appendMarkdownToDoc(i,n,l,s),!0}catch(e){return console.error(`[SiYuan] Sync failed for book "${a}" at ${o.serverUrl}:`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class We{constructor(e,a){this.databaseService=e,this.notionSync=new Pe(a),this.yuqueSync=new je(a),this.readwiseSync=new Ke(a),this.imaSync=new He(a),this.siyuanSync=new Je(a)}getExtraServices(){return[]}getEnabledServices(){const e=[];return this.notionSync.isEnabled()&&e.push({name:"Notion",sync:this.notionSync.syncNote.bind(this.notionSync)}),this.yuqueSync.isEnabled()&&e.push({name:"Yuque",sync:this.yuqueSync.syncNote.bind(this.yuqueSync)}),this.readwiseSync.isEnabled()&&e.push({name:"Readwise",sync:this.readwiseSync.syncNote.bind(this.readwiseSync)}),this.imaSync.isEnabled()&&e.push({name:"IMA",sync:this.imaSync.syncNote.bind(this.imaSync)}),this.siyuanSync.isEnabled()&&e.push({name:"SiYuan",sync:this.siyuanSync.syncNote.bind(this.siyuanSync)}),[...e,...this.getExtraServices()]}syncNote(e,a){return m(this,void 0,void 0,(function*(){const t=this.getEnabledServices();if(0===t.length)return;let o="Unknown Book",i="";if(a||e.bookKey)try{const t=yield this.databaseService.getRecord(a||e.bookKey,"books");t&&t.name&&(o=t.name),t&&t.author&&(i=t.author)}catch(t){console.error(`[NoteSync] Failed to resolve book info for key: ${a||e.bookKey}`,JSON.stringify(t))}const n=(yield Promise.allSettled(t.map((a=>m(this,void 0,void 0,(function*(){var t,n,r,l;try{const r=yield a.sync(e,o,i);return r||console.error(`[NoteSync] ${a.name} sync returned false for book "${o}" (noteId: ${null!==(n=null!==(t=e.noteKey)&&void 0!==t?t:e.key)&&void 0!==n?n:"unknown"})`),{name:a.name,success:r}}catch(t){return console.error(`[NoteSync] ${a.name} sync threw an error for book "${o}" (noteId: ${null!==(l=null!==(r=e.noteKey)&&void 0!==r?r:e.key)&&void 0!==l?l:"unknown"}):`,JSON.stringify(t)),{name:a.name,success:!1}}})))))).filter((e=>"rejected"===e.status||"fulfilled"===e.status&&!e.value.success)).map((e=>"fulfilled"===e.status?e.value.name:"Unknown"));n.length>0&&console.error(`[NoteSync] Sync failed for services: ${n.join(", ")} | book: "${o}"`)}))}}class qe{constructor(e,a,t){this.configService=e,this.fs=a,this.path=t}getConfig(){try{const e=this.configService.getObjectConfig("markdownSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Markdown] markdownSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Markdown] Failed to read markdownSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableMarkdownSync")}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="\n---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}sanitizeFileName(e){return e.replace(/[\\/:*?"<>|]/g,"_").trim()}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=o.folder;if(!i)return console.error("[Markdown] Sync skipped: markdownSyncConfig.folder is not set"),!1;const n=this.fs,r=this.path;try{const o=this.sanitizeFileName(a),l=r.join(i,`${o}.md`);if(!n.existsSync(l)){const e=`# ${a}\n`,o=t?`**Author:** ${t}\n\n`:"\n";try{n.writeFileSync(l,e+o,"utf-8")}catch(e){return console.error(`[Markdown] Failed to create file "${l}" for book "${a}":`,JSON.stringify(e)),!1}}const s=this.formatNoteMarkdown(e);try{n.appendFileSync(l,s,"utf-8")}catch(e){return console.error(`[Markdown] Failed to append to file "${l}" for book "${a}":`,JSON.stringify(e)),!1}return!0}catch(e){return console.error(`[Markdown] Sync failed for book "${a}" in folder "${i}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class Ge extends We{constructor(e,a,t,o){super(e,a),this.markdownSync=new qe(a,t,o)}getExtraServices(){return this.markdownSync.isEnabled()?[{name:"Markdown",sync:this.markdownSync.syncNote.bind(this.markdownSync)}]:[]}}class Qe{constructor(a){this.syncWordToEudic=(a,t)=>m(this,void 0,void 0,(function*(){var o,i,n,r,l,s,d,c,u,m;if("yes"===this.configService.getReaderConfig("isEnableEudicSync"))try{let c;try{c=this.configService.getObjectConfig("eudicSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[Eudic] Failed to read eudicSyncConfig:",JSON.stringify(e))}if(!c||!c.accessToken)return void console.error("[Eudic] Sync skipped: config is missing or accessToken is not set",JSON.stringify({hasConfig:!!c}));const u=c.language||"en",m={Authorization:`NIS ${c.accessToken}`,"Content-Type":"application/json","User-Agent":"Mozilla/5.0"};let p="0";const h=(c.categoryName||"").trim();if(h)if(void 0!==c.categoryId)p=c.categoryId;else try{const a=(null===(o=(yield e.get(`https://api.frdic.com/api/open/v1/studylist/category?language=${u}`,{headers:m})).data)||void 0===o?void 0:o.data)||[],t=a.find((e=>e.name===h));t?p=t.id:console.error(`[Eudic] Category "${h}" not found among available categories:`,JSON.stringify(a.map((e=>e.name))));const i=Object.assign(Object.assign({},c),{categoryId:p});this.configService.setObjectConfig("eudicSyncConfig",i,"thirdpartyToken")}catch(e){console.error("[Eudic] Failed to fetch category list:",null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.status,JSON.stringify(null!==(r=null===(n=null==e?void 0:e.response)||void 0===n?void 0:n.data)&&void 0!==r?r:e))}try{yield e.post("https://api.frdic.com/api/open/v1/studylist/word",{language:u,word:a,context_line:t||"",category_ids:[p]},{headers:m})}catch(e){throw console.error(`[Eudic] Failed to add word "${a}" to study list (category: ${p}):`,null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,JSON.stringify(null!==(d=null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.data)&&void 0!==d?d:e)),e}}catch(e){console.error("[Eudic] Sync error for word:",a,null===(c=null==e?void 0:e.response)||void 0===c?void 0:c.status,JSON.stringify(null!==(m=null===(u=null==e?void 0:e.response)||void 0===u?void 0:u.data)&&void 0!==m?m:e))}})),this.syncWordToAnki=(a,t,o,i,n="")=>m(this,void 0,void 0,(function*(){var r,l,s,d,c,u,m,p,h,g;if("yes"===this.configService.getReaderConfig("isEnableAnkiSync"))try{let h;try{h=this.configService.getObjectConfig("ankiSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[Anki] Failed to read ankiSyncConfig:",JSON.stringify(e))}if(!h||!h.deckName)return void console.error("[Anki] Sync skipped: config is missing or deckName is not set",JSON.stringify({hasConfig:!!h}));const g=h.host||"127.0.0.1",f=`http://${g}:${h.port||"8765"}`,y=h.deckName,N="Koodo Reader Word",v=(a,t={})=>{const o={action:a,version:6,params:t};return h.apiKey&&(o.key=h.apiKey),e.post(f,o)};if(!h.modelName)try{const e=yield v("modelNames");if(!((null===(r=e.data)||void 0===r?void 0:r.result)||[]).includes(N))try{yield v("createModel",{modelName:N,inOrderFields:["Word","Sentence","Book","Chapter","Definition"],cardTemplates:[{Name:"Card 1",Front:"{{Word}}

{{Sentence}}

{{Book}}
{{Chapter}}",Back:"{{Definition}}"}]})}catch(e){throw console.error(`[Anki] Failed to create model "${N}":`,JSON.stringify(null!==(s=null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.data)&&void 0!==s?s:e)),e}this.configService.setObjectConfig("ankiSyncConfig",Object.assign(Object.assign({},h),{modelName:N}),"thirdpartyToken")}catch(e){throw console.error(`[Anki] Failed to fetch model names from ${f}:`,JSON.stringify(null!==(c=null===(d=null==e?void 0:e.response)||void 0===d?void 0:d.data)&&void 0!==c?c:e)),e}try{const e=yield v("addNote",{note:{deckName:y,modelName:N,fields:{Word:a,Sentence:t||"",Book:o||"",Chapter:i||"",Definition:n||""},options:{allowDuplicate:!1},tags:[]}});(null===(u=e.data)||void 0===u?void 0:u.error)&&console.error(`[Anki] addNote returned an error for word "${a}" in deck "${y}":`,JSON.stringify(e.data.error))}catch(e){throw console.error(`[Anki] Failed to add note for word "${a}" to deck "${y}" at ${f}:`,JSON.stringify(null!==(p=null===(m=null==e?void 0:e.response)||void 0===m?void 0:m.data)&&void 0!==p?p:e)),e}}catch(e){console.error("[Anki] Sync error for word:",a,JSON.stringify(null!==(g=null===(h=null==e?void 0:e.response)||void 0===h?void 0:h.data)&&void 0!==g?g:e))}})),this.syncWordToMaiMemo=a=>m(this,void 0,void 0,(function*(){var t,o,i,n,r,l,s,d,c,u,m,p,h,g,f,y,N,v,b,k;if("yes"===this.configService.getReaderConfig("isEnableMaiMemoSync"))try{let v;try{v=this.configService.getObjectConfig("maimemoSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[MaiMemo] Failed to read maimemoSyncConfig:",JSON.stringify(e))}if(!v||!v.accessToken||!v.notepadName)return void console.error("[MaiMemo] Sync skipped: config is missing accessToken or notepadName",JSON.stringify({hasConfig:!!v}));const b=v.accessToken,k=v.notepadName.trim(),S={Authorization:`Bearer ${b}`,"Content-Type":"application/json",Accept:"application/json"};let E=v.notepadId||"";if(!E)try{const l=yield e.get("https://open.maimemo.com/open/api/v1/memo/notepads",{headers:S}),s=((null===(o=null===(t=l.data)||void 0===t?void 0:t.data)||void 0===o?void 0:o.notepads)||[]).find((e=>"PUBLISHED"===e.status&&e.title===k));if(s)E=s.id;else{if(E=null===(r=null===(n=null===(i=(yield e.post("https://open.maimemo.com/open/api/v1/memo/notepads",{notepad:{status:"PUBLISHED",content:a,title:k,brief:k,tags:[]}},{headers:S})).data)||void 0===i?void 0:i.data)||void 0===n?void 0:n.notepad)||void 0===r?void 0:r.id,!E)return void console.error("[MaiMemo] Created notepad but no id returned")}this.configService.setObjectConfig("maimemoSyncConfig",Object.assign(Object.assign({},v),{notepadId:E}),"thirdpartyToken")}catch(e){return void console.error("[MaiMemo] Failed to resolve notepadId:",null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,JSON.stringify(null!==(d=null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.data)&&void 0!==d?d:e))}try{let t="";try{t=(null===(m=null===(u=null===(c=(yield e.get(`https://open.maimemo.com/open/api/v1/memo/notepads/${E}`,{headers:S})).data)||void 0===c?void 0:c.data)||void 0===u?void 0:u.notepad)||void 0===m?void 0:m.content)||""}catch(e){return void console.error("[MaiMemo] Failed to fetch notepad content:",null===(p=null==e?void 0:e.response)||void 0===p?void 0:p.status,JSON.stringify(null!==(g=null===(h=null==e?void 0:e.response)||void 0===h?void 0:h.data)&&void 0!==g?g:e))}const o=t.split("\n").map((e=>e.trim())).filter((e=>e.length>0));if(o.includes(a))return;o.push(a),yield e.post(`https://open.maimemo.com/open/api/v1/memo/notepads/${E}`,{id:E,notepad:{status:"PUBLISHED",content:o.join("\n"),title:k,brief:k,tags:[]}},{headers:S})}catch(e){throw console.error(`[MaiMemo] Failed to add word "${a}" to notepad "${k}" (${E}):`,null===(f=null==e?void 0:e.response)||void 0===f?void 0:f.status,JSON.stringify(null!==(N=null===(y=null==e?void 0:e.response)||void 0===y?void 0:y.data)&&void 0!==N?N:e)),e}}catch(e){console.error("[MaiMemo] Sync error for word:",a,null===(v=null==e?void 0:e.response)||void 0===v?void 0:v.status,JSON.stringify(null!==(k=null===(b=null==e?void 0:e.response)||void 0===b?void 0:b.data)&&void 0!==k?k:e))}})),this.configService=a}}class Ye extends Qe{}export{S as CommonTool,ze as ConfigService,Be as HighlightUtil,Ae as KOReaderUtil,A as KookitConfig,ye as LoginHelper,Ge as NoteSyncManager,he as ReaderRequest,ve as ReadingTimeUtil,ce as SqlStatement,Ne as SyncHelper,oe as SyncUtil,ge as ThirdpartyRequest,fe as UserRequest,Ye as WordSyncManager}; diff --git a/src/assets/lib/kookit-extra.min.mjs b/src/assets/lib/kookit-extra.min.mjs index 15ba89be..9c8a7667 100644 --- a/src/assets/lib/kookit-extra.min.mjs +++ b/src/assets/lib/kookit-extra.min.mjs @@ -1 +1 @@ -import e from"axios";import t from"fs";import i from"path";import{promisify as o}from"util";import r from"stream";import{Client as s}from"basic-ftp";import{S3Client as n,ListObjectsV2Command as a,DeleteObjectCommand as d,PutObjectCommand as l,GetObjectCommand as c}from"@aws-sdk/client-s3";import{AuthType as u,createClient as h}from"webdav";import p from"ssh2-sftp-client";import f from"form-data";import{Storage as g}from"megajs";import y from"crypto";import m from"os";import{SSE as v}from"sse.js";import k from"electron-store";function b(e,t,i,o){return new(i||(i=Promise))((function(r,s){function n(e){try{d(o.next(e))}catch(e){s(e)}}function a(e){try{d(o.throw(e))}catch(e){s(e)}}function d(e){var t;e.done?r(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(n,a)}d((o=o.apply(e,t||[])).next())}))}const F=e=>"json"===e?"application/json":["jpg","jpeg","png","gif","bmp"].includes(e)?"image/"+e:"zip"===e?"application/zip":"epub"===e?"application/epub+zip":"txt"===e?"text/plain":"pdf"===e?"application/pdf":"mobi"===e?"application/x-mobipocket-ebook":"azw3"===e||"azw"===e?"application/vnd.amazon.ebook":"cbz"===e?"application/x-cbz":"cbr"===e?"application/x-cbr":"cbt"===e?"application/x-cbt":"cb7"===e?"application/x-cb7":"fb2"===e?"application/x-fictionbook+xml":"html"===e?"text/html":"css"===e?"text/css":"js"===e?"application/javascript":"xml"===e?"application/xml":"xhtml"===e?"application/xhtml+xml":"opf"===e?"application/oebps-package+xml":"ncx"===e?"application/x-dtbncx+xml":"mp3"===e?"audio/mpeg":"wav"===e?"audio/wav":"ogg"===e?"audio/ogg":"mp4"===e?"video/mp4":"webm"===e?"video/webm":"avi"===e?"video/x-msvideo":"wmv"===e?"video/x-ms-wmv":"flv"===e?"video/x-flv":"m3u8"===e?"application/x-mpegURL":"ts"===e?"video/MP2T":"3gp"===e?"video/3gpp":"3g2"===e?"video/3gpp2":"db"===e?"application/x-sqlite3":void 0,w={_chars:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",encode(e){if("string"!=typeof e)throw new Error("Input must be a string");let t="",i=0;const o=this._stringToUtf8Bytes(e),r=o.length;for(;i>2,d=(3&e)<<4|s>>4,l=(15&s)<<2|n>>6,c=63&n;t+=this._chars.charAt(a),t+=this._chars.charAt(d),t+=i-2>=r?"=":this._chars.charAt(l),t+=i-1>=r?"=":this._chars.charAt(c)}return t},decode(e){if("string"!=typeof e)throw new Error("Input must be a string");for(e=e.replace(/[^A-Za-z0-9+/]/g,"");e.length%4!=0;)e+="=";const t=[];let i=0;const o=e.length;for(;i>4,d=(15&r)<<4|s>>2,l=(3&s)<<6|n;t.push(a),-1!==s&&t.push(d),-1!==n&&t.push(l)}return this._utf8BytesToString(t)},_stringToUtf8Bytes(e){const t=[];for(let i=0;i>6),t.push(128|63&o);else if(55296==(64512&o)&&i+1>18),t.push(128|e>>12&63),t.push(128|e>>6&63),t.push(128|63&e)}else t.push(239,191,189),i--}else t.push(224|o>>12),t.push(128|o>>6&63),t.push(128|63&o)}return t},_utf8BytesToString(e){let t="",i=0;for(;i65535){const i=e-65536;t+=String.fromCharCode(55296|i>>10),t+=String.fromCharCode(56320|1023&i)}else t+=String.fromCharCode(e)}else t+="�"}else t+="�"}return t},encodeURL(e){return this.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")},decodeURL(e){for(e=e.replace(/-/g,"+").replace(/_/g,"/");e.length%4;)e+="=";return this.decode(e)}};class E{constructor(e){this.queue=[],this.runningTasks=0,this.totalTasks=0,this.completedTasks=0,this.hasFailedTasks=!1,this.downloadedSize=0,this.maxConcurrency=e}addTask(e){return b(this,void 0,void 0,(function*(){return this.totalTasks++,new Promise(((t,i)=>{if(this.hasFailedTasks)return void t(void 0);const o=()=>b(this,void 0,void 0,(function*(){if(this.hasFailedTasks)return this.completedTasks++,void t(void 0);try{this.runningTasks++;const i=yield e();return this.completedTasks++,t(i),i}catch(e){throw this.completedTasks++,i(e),e}finally{this.runningTasks--,this.runNext()}}));this.runningTasks0;){const e=this.queue.shift();e&&e()}else if(this.queue.length>0&&this.runningTasks=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=[],r=!0,s=null;for(;r;){let n;n=s?yield e.post("https://api.dropboxapi.com/2/files/list_folder/continue",{cursor:s},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}}):yield e.post("https://api.dropboxapi.com/2/files/list_folder",{path:"/"+t,limit:2e3},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});const a=n.data.entries||[];o=o.concat(a),r=n.data.has_more,s=n.data.cursor}return[...new Set(o.map((e=>({name:e.name,size:e.size||0,type:e[".tag"],modified:e.client_modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;yield e.post("https://api.dropboxapi.com/2/files/delete_v2",{path:"/"+t},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});return!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://www.dropbox.com/oauth2/authorize?response_type=code&token_access_type=offline&client_id=${x}&redirect_uri=${e}`}}const j=o(r.pipeline);class D extends Q{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token,n=t.createReadStream(i.join(this.storagePath,o));return yield e.post("https://content.dropboxapi.com/2/files/upload",n,{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/octet-stream","Dropbox-API-Arg":JSON.stringify({path:"/"+r,mode:"overwrite",autorename:!0,mute:!1})},maxContentLength:1/0,maxBodyLength:1/0}),!0}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token,n=t.createWriteStream(i.join(this.storagePath,r)),a=yield e({url:"https://content.dropboxapi.com/2/files/download",method:"GET",responseType:"stream",headers:{Authorization:`Bearer ${s}`,"Dropbox-API-Arg":JSON.stringify({path:"/"+o})},maxContentLength:1/0,maxBodyLength:1/0});let d=0;return a.data.on("data",(e=>{d+=e.length,this.taskQueue.setDownloadedSize(d)})),yield j(a.data,n),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class B{constructor(e){this.config=e,this.storagePath=e.storagePath,this.taskQueue=new E(1),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getClient(){return b(this,void 0,void 0,(function*(){try{if(this.client&&!1===this.client.closed)return this.client;let{url:e,username:t,password:i,dir:o,ssl:r,port:n}=this.config;const a=new s(0);a.ftp.verbose=!0;const d=a.access({host:e,port:parseInt(n),user:t,password:i,secure:"1"===r}),l=new Promise(((e,t)=>{setTimeout((()=>t(new Error("FTP connection timeout"))),5e3)}));return yield Promise.race([d,l]),this.client=a,a}catch(e){throw console.error("Error connecting to FTP server:",e),this.client=null,e}}))}uploadFile(e,t){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let{dir:o}=this.config;o=o&&"KoodoReader"===this.baseFolder?o:this.baseFolder;const r=yield this.getClient(),s=()=>b(this,void 0,void 0,(function*(){yield r.ensureDir(i.dirname(o+"/"+t)),yield r.cd("/"),yield r.uploadFrom(i.join(this.storagePath,e),o+"/"+t)}));try{return yield s(),!0}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let{dir:r}=this.config;r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder;const s=yield this.getClient(),n=t.createWriteStream(i.join(this.storagePath,o)),a=()=>b(this,void 0,void 0,(function*(){s.trackProgress((e=>{this.taskQueue.setDownloadedSize(e.bytes||0)})),yield s.downloadTo(n,r+"/"+e),s.trackProgress()}));try{return yield a(),!0}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.listFilesWithoutQueue(e)}))))))}))}listFilesWithoutQueue(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;const i=yield this.getClient(),o=()=>b(this,void 0,void 0,(function*(){return yield i.list(t+"/"+e)}));try{return(yield o()).map((e=>({name:e.name,size:e.size||0,type:e.isFile?"file":"folder",modified:e.modifiedAt?e.modifiedAt.toISOString():""})))}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;const i=yield this.getClient(),o=()=>b(this,void 0,void 0,(function*(){yield i.remove(t+"/"+e)}));try{return yield o(),!0}catch(e){return console.error(e),!1}}))}}class M{constructor(e){this.isExp=!1,this.baseUrl="https://graph.microsoft.com/v1.0/me/drive/special/approot",this.config=e,this.taskQueue=new E(3),this.isExp=this.config.isExp||!1,this.baseUrl=this.isExp?"https://graph.microsoft.com/v1.0/me/drive/root":"https://graph.microsoft.com/v1.0/me/drive/special/approot",void 0===this.config.baseFolder?this.baseFolder=this.isExp?"KoodoReader":"":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);let o,r=[];if(""===t)o=`${this.baseUrl}/children`;else{const e=encodeURIComponent(t);o=`${this.baseUrl}:/${e}:/children`}for(;o;){const t=yield e.get(o,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});if(t.status>=300)break;const s=t.data.value||[];r=r.concat(s),o=t.data["@odata.nextLink"]||""}return[...new Set(r.map((e=>({name:e.name,size:e.size||0,type:e.folder?"folder":"file",modified:e.lastModifiedDateTime}))))]}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);const o=yield e.delete(`${this.baseUrl}:/${t}`,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});return!(o.status>=300)||(console.error("Error deleting file:",o),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${I}&scope=${this.isExp?"files.readwrite.all":"files.readwrite.appfolder"} offline_access&response_type=code&redirect_uri=${e}`}}const U=209715200;class W extends M{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){var s;let n=null;try{const s=this.config.access_token;let a=this.baseFolder+"/"+r;for(;a.startsWith("/");)a=a.substring(1);const d=i.join(this.storagePath,o),l=yield this.getFileSize(d),c=a.split(".").pop(),u=(F(c||""),`${this.baseUrl}:/${a}:/createUploadSession`),h=(yield e.post(u,{item:{"@microsoft.graph.conflictBehavior":"replace"}},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}})).data.uploadUrl;n=yield t.promises.open(d,"r");let p=0,f=Buffer.alloc(U);for(;pthis.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token;let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const a=`${this.baseUrl}:/${n}:/content`;let d=(yield fetch(a,{headers:{Authorization:"Bearer "+s},redirect:"manual"})).headers.get("location");if(d){const o=yield e.get(d,{responseType:"stream"});let s=0;const n=t.createWriteStream(i.join(this.storagePath,r));return o.data.on("data",(e=>{s+=e.length,this.taskQueue.setDownloadedSize(s)})),yield new Promise(((e,t)=>{o.data.pipe(n),n.on("finish",(()=>{e()})),n.on("error",t)})),!0}return!1}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}class N{constructor(e){this.isExp=!1,this.folderIdCache=new Map,this.config=e,this.taskQueue=new E(3),this.isExp=this.config.isExp||!1,this.baseFolder="KoodoReader"}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getFileId(t,i){return b(this,void 0,void 0,(function*(){const o=this.config.access_token,r=`https://www.googleapis.com/drive/v3/files?q=name='${t}'+and+'${i}'+in+parents&fields=files(id,name)`;try{const t=yield e.get(r,{headers:{Authorization:"Bearer "+o}});if(0===t.data.files.length)return"";const i=t.data.files;return i.length>0?i[0].id:null}catch(e){return console.error("Error occurred during file list retrieval:",e),""}}))}checkFolder(t){return b(this,void 0,void 0,(function*(){t=this.baseFolder+"/"+t;const i=this.config.access_token;if(""===t)return"root";if(this.folderIdCache.has(t))return this.folderIdCache.get(t);const o=t.split("/").filter((e=>""!==e.trim()));let r="root",s="";for(const t of o){if(s=s?s+"/"+t:t,this.folderIdCache.has(s)){r=this.folderIdCache.get(s);continue}let o=yield this.getFolderId(t,r);if(!o){const s={name:t,mimeType:"application/vnd.google-apps.folder",parents:[r]};try{o=(yield e.post("https://www.googleapis.com/drive/v3/files",s,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.id}catch(e){throw console.error(`Error occurred during folder creation for ${t}:`,e),e}}this.folderIdCache.set(s,o),r=o}return r}))}getFolderId(t,i){return b(this,void 0,void 0,(function*(){const o=this.config.access_token,r=`https://www.googleapis.com/drive/v3/files?q=name='${t=encodeURIComponent(t)}'+and+mimeType='application/vnd.google-apps.folder'+and+'${i}'+in+parents&fields=files(id,name)`;try{const t=(yield e.get(r,{headers:{Authorization:`Bearer ${o}`}})).data.files;return t.length>0?t[0].id:null}catch(e){throw console.error("Error occurred during fetching folder ID:",e),e}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=yield this.checkFolder(t),r=[],s="",n=!0;for(;n;){let t=`https://www.googleapis.com/drive/v3/files?q='${o}'+in+parents&fields=nextPageToken,files(id,name,size,mimeType)&pageSize=1000`;s&&(t+=`&pageToken=${s}`);const a=yield e.get(t,{headers:{Authorization:`Bearer ${i}`}}),d=a.data.files||[];r=r.concat(d),s=a.data.nextPageToken,n=!!s}return[...new Set(r.map((e=>({name:e.name,size:e.size||0,type:"application/vnd.google-apps.folder"===e.mimeType?"folder":"file",modified:e.modifiedTime}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQue(e)}))))))}))}deleteFileWithoutQue(t){return b(this,void 0,void 0,(function*(){const i=t.split("/").pop()||"",o=t.split("/").slice(0,-1).join("/"),r=yield this.checkFolder(o),s=this.config.access_token,n=yield this.getFileId(i,r);if(""===n)return console.error("File not found:",i),!0;try{const t=yield e.delete(`https://www.googleapis.com/drive/v3/files/${n}`,{headers:{Authorization:`Bearer ${s}`}});return console.error("File deleted:",t),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${e}&prompt=consent&response_type=code&client_id=${$}&scope=https://www.googleapis.com/auth/${this.isExp?"drive":"drive.file"}&access_type=offline`}}class K extends N{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token;let n=o.split("/").pop(),a=r.split(".").pop(),d=F(a||""),l=r.split("/").slice(0,-1).join("/"),c=yield this.checkFolder(l),u=yield this.getFileId(n||"",c);const h={mimeType:d,name:n,parents:[c]},p=u?`https://www.googleapis.com/upload/drive/v3/files/${u}?uploadType=resumable`:"https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable",f=(yield e({method:u?"PATCH":"POST",url:p,data:u?null:JSON.stringify(h),headers:{Authorization:"Bearer "+s,"Content-Type":"application/json; charset=UTF-8"},maxContentLength:1/0,maxBodyLength:1/0})).headers.location;let g=yield this.getFileSize(i.join(this.storagePath,o));const y=t.createReadStream(i.join(this.storagePath,o));yield e.put(f,y,{headers:{Authorization:"Bearer "+s,"Content-Type":"application/zip","Content-Range":`bytes 0-${g-1}/${g}`},maxContentLength:1/0,maxBodyLength:1/0});return!0}catch(e){return console.error("Error occurred during upload:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token;let n=o.split("/").pop(),a=o.split("/").slice(0,-1).join("/"),d=yield this.checkFolder(a),l=yield this.getFileId(n||"",d);if(!l)return console.error("File not found"),!0;const c=`https://www.googleapis.com/drive/v3/files/${l}?alt=media`;return new Promise((o=>{const n=t.createWriteStream(i.join(this.storagePath,r));e({url:c,method:"GET",responseType:"stream",headers:{Authorization:"Bearer "+s},maxContentLength:1/0,maxBodyLength:1/0}).then((e=>{let t=0;e.data.on("data",(e=>{t+=e.length,this.taskQueue.setDownloadedSize(t)})),e.data.pipe(n),n.on("finish",(()=>{o(!0)})),n.on("error",(()=>{o(!1)}))})).catch((e=>{console.error("Error downloading file:",e),o(!1)}))}))}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}class H{constructor(e){this.config=e,this.taskQueue=new E(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}shouldUsePathStyle(){try{if(this.config.forcePathStyle&&"no"!==this.config.forcePathStyle)return!0;let e=this.config.endpoint;const t=new URL(e),i=t.hostname,o=/^(\d{1,3}\.){3}\d{1,3}$/.test(i),r=""!==t.port;return!o&&r}catch(e){return!0}}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:o,accessKeyId:r,secretAccessKey:s,dir:d}=this.config;d=d&&"KoodoReader"===this.baseFolder?d:this.baseFolder;let l=d+"/"+e;for(;l.startsWith("/");)l=l.substring(1);""===l||l.endsWith("/")||(l+="/");const c=new n({endpoint:t,region:i,credentials:{accessKeyId:r,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});try{let e,t=[],i=[],r=!0;for(;r;){const s=yield c.send(new a({Bucket:o,Prefix:l,Delimiter:"/",ContinuationToken:e}));s.Contents&&(t=t.concat(s.Contents)),s.CommonPrefixes&&(i=i.concat(s.CommonPrefixes)),e=s.NextContinuationToken,r=!!e}let s=[];return t.forEach((e=>{if(!e.Key.endsWith("/")){const t=e.Key.substring(l.length);t.includes("/")||s.push({name:t,size:e.Size||0,type:"file",modified:e.LastModified?e.LastModified.toISOString():""})}})),i.forEach((e=>{const t=e.Prefix.substring(l.length).replace(/\/$/,"");t&&s.push({name:t,size:0,type:"folder",modified:""})})),s}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:o,accessKeyId:r,secretAccessKey:s,dir:a}=this.config;a=a&&"KoodoReader"===this.baseFolder?a:this.baseFolder;const l=new n({endpoint:t,region:i,credentials:{accessKeyId:r,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});let c=a+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{return yield l.send(new d({Bucket:o,Key:c})),!0}catch(e){return console.error(e),!1}}))}}class q extends H{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){let{endpoint:r,region:s,bucketName:a,accessKeyId:d,secretAccessKey:c,dir:u}=this.config;const h=new n({endpoint:r,region:s,credentials:{accessKeyId:d,secretAccessKey:c},forcePathStyle:this.shouldUsePathStyle()});u=u&&"KoodoReader"===this.baseFolder?u:this.baseFolder;let p=u+"/"+o;for(;p.startsWith("/");)p=p.substring(1);try{let o=yield h.send(new l({Bucket:a,Key:p,Body:t.createReadStream(i.join(this.storagePath,e))}));return 200===o.$metadata.httpStatusCode||(console.error("Error uploading file:",o),!1)}catch(e){return console.error("Error: ",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let{endpoint:r,region:s,bucketName:a,accessKeyId:d,secretAccessKey:l,dir:u}=this.config;u=u&&"KoodoReader"===this.baseFolder?u:this.baseFolder;const h=(e,t,i,o)=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){const s=yield e.send(new c({Bucket:t,Key:i}));let n=0;s.Body?(s.Body.on("data",(e=>{n+=e.length,this.taskQueue.setDownloadedSize(n)})),s.Body.pipe(o),o.on("finish",(e=>{e&&r(!1),r(!0)}))):r(!1)})))),p=()=>new Promise(((c,p)=>{const f=new n({region:s,endpoint:r,credentials:{accessKeyId:d,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});let g=t.createWriteStream(i.join(this.storagePath,o)),y=u+"/"+e;for(;y.startsWith("/");)y=y.substring(1);h(f,a,y,g).then((e=>{c(!0)})).catch((e=>{console.error(e),c(!1)}))}));try{return yield p()}catch(e){return console.error(e),!1}}))))))}))}}class J{constructor(e){let{username:t,password:i,url:o,dir:r,AuthType:s,createClient:n}=e;void 0===e.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=e.baseFolder,r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder,this.username=t,this.password=i,this.url=o,this.dir=r,this.taskQueue=new E(5),this.AuthType=s,this.createClient=n}getClient(){return b(this,void 0,void 0,(function*(){return this.webdavClient||(this.url=yield this.handleUrlRedirection(this.url),this.webdavClient=this.createClient(this.url,{authType:this.AuthType.Password,username:this.username,password:this.password})),this.webdavClient}))}handleUrlRedirection(t){return b(this,void 0,void 0,(function*(){try{const i=yield e.head(t,{maxRedirects:0,validateStatus:()=>!0,timeout:5e3});return i.request&&i.request.responseURL&&i.request.responseURL!==t?i.request.responseURL:i.status>=300&&i.status<400&&i.headers.location?i.headers.location:t}catch(e){return console.info("Error handling URL redirection:",e),t}}))}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){const t=yield this.getClient();try{const i=t.getDirectoryContents(this.dir+"/"+e),o=new Promise(((e,t)=>{setTimeout((()=>t(new Error("WebDAV list directory timeout"))),5e3)}));return(yield Promise.race([i,o])).filter((t=>"."!==t.filename&&".."!==t.filename&&t.filename!==e)).map((e=>({name:e.basename,size:e.size||0,type:"directory"===e.type?"folder":"file",modified:e.lastmod})))}catch(i){return i.response&&404===i.response.status&&(yield t.createDirectory(this.dir+"/"+e)),console.error("Error listing files:",i),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){const t=yield this.getClient();try{return yield t.deleteFile(this.dir+"/"+e),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(e){return b(this,void 0,void 0,(function*(){let t=yield this.getClient();try{const i=e.replace(/^\/+|\/+$/g,"").split("/").filter((e=>e.length>0));let o="";for(const e of i)o=o?`${o}/${e}`:e,(yield t.exists(`/${o}`))||(yield t.createDirectory(`/${o}`));return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}}class V extends J{constructor(e){super(Object.assign(Object.assign({},e),{AuthType:u,createClient:h})),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let s=yield this.getClient();const n=s.exists(i.dirname(this.dir+"/"+r)),a=new Promise(((e,t)=>{setTimeout((()=>t(new Error("WebDAV exists check timeout"))),5e3)}));!1===(yield Promise.race([n,a]))&&(yield this.ensureDirectoryExists(i.dirname(this.dir+"/"+r)));let d=t.readFileSync(i.join(this.storagePath,o)),l=i.extname(o).substring(1),c=F(l),u=s.createWriteStream(this.dir+"/"+r,{headers:{"content-type":c,"content-length":d.length}});return t.createReadStream(i.join(this.storagePath,o)).pipe(u),new Promise(((t,i)=>{u.on("finish",(()=>{t(!0)})),u.on("error",(i=>b(this,void 0,void 0,(function*(){console.error("Error occurred during file upload:",i);try{let i=s.getFileUploadLink(this.dir+"/"+r);const o=new URL(i);o.search="",i=o.toString();const n=Buffer.from(this.username+":"+this.password,"binary").toString("base64");yield e.put(i,d,{headers:{Authorization:"Basic "+n,"Content-Type":c,"Content-Length":d.length},maxContentLength:1/0,maxBodyLength:1/0});t(!0)}catch(e){console.error("Error occurred during file upload:",e),t(!1)}}))))}))}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){if(this.taskQueue.setDownloadedSize(0),-1===e.indexOf("."))return new ArrayBuffer(0);try{let r=yield this.getClient();if(!1===(yield r.exists(this.dir+"/"+e)))return!0;let s=0,n=t.createWriteStream(i.join(this.storagePath,o)),a=r.createReadStream(this.dir+"/"+e);return a.on("data",(e=>{s+=e.length,this.taskQueue.setDownloadedSize(s)})),a.pipe(n),new Promise(((e,t)=>{n.on("finish",(()=>{e(!0)})),n.on("error",(t=>{e(!1)}))}))}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class X{constructor(e){this.folderExistsCache=new Set,this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){var i,o;return b(this,void 0,void 0,(function*(){try{const r=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);let s=[],n=0;const a=1e3;let d=!0;for(;d;){const l=yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${r}`,"Content-Type":"application/json"},params:{path:t?`/${t}`:"/",limit:a,offset:n,fields:"_embedded.items.name,_embedded.items.size,_embedded.items.type,_embedded.items.modified,_embedded.total"}}),c=(null===(i=l.data._embedded)||void 0===i?void 0:i.items)||[];s=s.concat(c);const u=(null===(o=l.data._embedded)||void 0===o?void 0:o.total)||0;n+=c.length,d=n({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);const o=yield e.delete("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:t?`/${t}`:"/",permanently:!1}});return 202===o.status||204===o.status}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(t){var i,o;return b(this,void 0,void 0,(function*(){try{const r=this.config.access_token,s=t.split("/").filter((e=>e.length>0));let n="";for(const t of s)if(n+="/"+t,!this.folderExistsCache.has(n))try{yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${r}`,"Content-Type":"application/json"},params:{path:n}}),this.folderExistsCache.add(n)}catch(t){if(404!==(null===(i=t.response)||void 0===i?void 0:i.status))return console.error("Error checking directory:",t),!1;try{yield e.put(`https://cloud-api.yandex.net/v1/disk/resources?path=${encodeURIComponent(n)}`,null,{headers:{Authorization:`OAuth ${r}`}}),this.folderExistsCache.add(n)}catch(e){if(409!==(null===(o=e.response)||void 0===o?void 0:o.status))return console.error("Error creating directory:",e),!1;this.folderExistsCache.add(n)}}return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}getAuthUrl(e){return`https://oauth.yandex.com/authorize?response_type=code&client_id=${R}&redirect_uri=${e}&force_confirm=true`}}const Y=o(r.pipeline);class G extends X{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token;let n=this.baseFolder+"/"+r;for(;n.startsWith("/");)n=n.substring(1);const a=n.substring(0,n.lastIndexOf("/"));if(a){if(!(yield this.ensureDirectoryExists(a)))return console.error("Failed to create directory:",a),!1}const d=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/upload",{headers:{Authorization:`OAuth ${s}`,"Content-Type":"application/json"},params:{path:`/${n}`,overwrite:!0}});if(200!==d.status)return console.error("Error getting upload URL:",d),!1;const l=d.data.href,c=t.createReadStream(i.join(this.storagePath,o));return yield e.put(l,c,{headers:{"Content-Type":"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0}),!0}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let s=this.baseFolder+"/"+o;for(;s.startsWith("/");)s=s.substring(1);try{const o=this.config.access_token,n=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/download",{headers:{Authorization:`OAuth ${o}`,"Content-Type":"application/json"},params:{path:`/${s}`}});if(200!==n.status)return console.error("Error getting download URL:",n),!1;const a=n.data.href,d=t.createWriteStream(i.join(this.storagePath,r)),l=yield e({url:a,method:"GET",responseType:"stream",maxContentLength:1/0,maxBodyLength:1/0});let c=0;return l.data.on("data",(e=>{c+=e.length,this.taskQueue.setDownloadedSize(c)})),yield Y(l.data,d),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class Z{constructor(e){this.config=e,this.storagePath=e.storagePath,this.taskQueue=new E(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getClient(){return b(this,void 0,void 0,(function*(){try{if(this.client)return this.client;let{url:e,username:t,password:i,dir:o,port:r}=this.config;const s=new p,n=s.connect({host:e||"",port:r||22,username:t||"",password:i||""}),a=new Promise(((e,t)=>{setTimeout((()=>t(new Error("SFTP connection timeout"))),5e3)}));return yield Promise.race([n,a]),this.client=s,s}catch(e){throw console.error("Error connecting to SFTP server:",e),this.client=null,e}}))}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let{dir:r}=this.config;r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder;let s=yield this.getClient();const n=()=>new Promise(((n,a)=>b(this,void 0,void 0,(function*(){let a=t.createReadStream(i.join(this.storagePath,e)),d="/"+r+"/"+o,l="/"+r+"/"+i.dirname(o);(yield s.exists(l))||(yield s.mkdir(l,!0)),s.put(a,d).then((()=>{n(!0)})).catch((e=>{console.error(e.message),n(!1)}))}))));try{return yield n()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let{dir:r}=this.config;r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder;let s=yield this.getClient();const n=()=>new Promise(((n,a)=>b(this,void 0,void 0,(function*(){let a="/"+r+"/"+e,d=i.join(this.storagePath,o),l=t.createWriteStream(d);s.get(a,l).then((()=>{this.taskQueue.setDownloadedSize(l.bytesWritten||0),n(!0)})).catch((e=>{console.error(e.message),n(!1)}))}))));try{return yield n()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;let i=yield this.getClient();const o=()=>new Promise(((o,r)=>b(this,void 0,void 0,(function*(){let r="/"+t+"/"+e;(yield i.exists(r))||(yield i.mkdir(r,!0),o([])),i.list(r).then((e=>{o(e.map((e=>({name:e.name,size:e.size||0,type:"d"===e.type?"folder":"file",modified:e.modifyTime}))))})).catch((e=>b(this,void 0,void 0,(function*(){console.error(e.message,"list file error"),o([])}))))}))));try{return yield o()}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;let i=yield this.getClient();try{return yield new Promise(((o,r)=>{let s="/"+t+"/"+e;i.delete(s).then((()=>{o(!0)})).catch((e=>{console.error(e.message),o(!1)}))}))}catch(e){return console.error(e),!1}}))}}class ee{downloadFile(e,t){return b(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}uploadFile(e,t){return b(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return new Promise((e=>{e([])}))}))}getAuthUrl(){return""}}class te{constructor(e){this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getFolderIdByPath(t){return b(this,void 0,void 0,(function*(){if(""==t)return"0";const i=this.config.access_token,o=t.split("/");let r="0";for(const t of o){const o=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=folder&limit=1000`;try{const s=(yield e.get(o,{headers:{Authorization:`Bearer ${i}`}})).data.entries.find((e=>e.name===t&&"folder"===e.type));if(s)r=s.id;else{const o={name:t,parent:{id:r},type:"folder"};r=(yield e.post("https://api.box.com/2.0/folders",o,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.id}}catch(e){return console.error("Error occurred during folder creation:",e),""}}return r}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=this.baseFolder+"/"+t;for(;o.startsWith("/");)o=o.substring(1);let r=yield this.getFolderIdByPath(o),s=[],n=0,a=!0;const d=1e3;for(;a;){const t=yield e.get(`https://api.box.com/2.0/folders/${r}/items`,{params:{limit:d,offset:n},headers:{Authorization:`Bearer ${i}`}}),o=t.data.entries||[];s=s.concat(o),n+=o.length,a=o.length===d&&t.data.total_count>n}return[...new Set(s.map((e=>({name:e.name,size:e.size||0,type:e.type,modified:e.content_modified_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=t.substring(0,t.lastIndexOf("/")),r=t.substring(t.lastIndexOf("/")+1);let s=this.baseFolder+"/"+o;for(;s.startsWith("/");)s=s.substring(1);const n=yield this.getFolderIdByPath(s);if(!n)return!0;const a=`https://api.box.com/2.0/folders/${n}/items?fields=id,name&type=file&limit=1000`,d=(yield e.get(a,{headers:{Authorization:`Bearer ${i}`}})).data.entries.find((e=>e.name===r&&"file"===e.type));return!d||(yield e.delete(`https://api.box.com/2.0/files/${d.id}`,{headers:{Authorization:`Bearer ${i}`}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://account.box.com/api/oauth2/authorize?${new URLSearchParams({response_type:"code",client_id:_,redirect_uri:e,grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}).toString()}`}}class ie extends te{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token,n=r.substring(0,r.lastIndexOf("/")),a=r.substring(r.lastIndexOf("/")+1);let d=this.baseFolder+"/"+n;for(;d.startsWith("/");)d=d.substring(1);const l=yield this.getFolderIdByPath(d);if(!l)throw new Error("Folder not found");const c=yield this.listFiles(n);c.find((e=>e===a))&&(yield this.deleteFileWithoutQueue(n+"/"+a));const u=new f,h=JSON.stringify({name:a,parent:{id:l}});u.append("attributes",h),u.append("file",t.createReadStream(i.join(this.storagePath,o)));const p=yield e.post("https://upload.box.com/api/2.0/files/content",u,{headers:Object.assign({Authorization:`Bearer ${s}`},u.getHeaders()),maxContentLength:1/0,maxBodyLength:1/0});return!(p.status>=300)||(console.error("Error occurred during file upload:",p),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token,n=o.substring(0,o.lastIndexOf("/")),a=o.substring(o.lastIndexOf("/")+1);let d=this.baseFolder+"/"+n;for(;d.startsWith("/");)d=d.substring(1);const l=yield this.getFolderIdByPath(d);if(!l)return console.error("Folder not found"),!0;const c=`https://api.box.com/2.0/folders/${l}/items?fields=id,name&type=file&limit=1000`,u=(yield e.get(c,{headers:{Authorization:`Bearer ${s}`}})).data.entries.find((e=>e.name===a&&"file"===e.type));if(!u)return console.error("File not found:",a),!0;const h=yield e({url:`https://api.box.com/2.0/files/${u.id}/content`,method:"get",responseType:"stream",headers:{Authorization:`Bearer ${s}`}});return yield new Promise(((e,o)=>{let s=0;const n=t.createWriteStream(i.join(this.storagePath,r));h.data.on("data",(e=>{s+=e.length,this.taskQueue.setDownloadedSize(s)})),h.data.pipe(n),n.on("finish",e),n.on("error",o)})),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class oe{constructor(e){this.folderCreationLocks=new Map,this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=2){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getStorage(){return b(this,void 0,void 0,(function*(){if(this.storage)return this.storage;let{email:e,password:t}=this.config;return this.storage=yield new g({email:e,password:t,userAgent:"KoodoReader/1.0"}).ready,this.storage}))}getRoot(){return b(this,void 0,void 0,(function*(){if(this.root)return this.root;const e=(yield this.getStorage()).root;if(""===this.baseFolder)return this.root=e,this.root;let t=e.children.find((e=>e.name===this.baseFolder&&e.directory));return t||(t=yield e.mkdir(this.baseFolder)),this.root=t,this.root}))}createFolder(e,t){return b(this,void 0,void 0,(function*(){const i=`${e.nodeId}_${t}`;if(this.folderCreationLocks.has(i))return yield this.folderCreationLocks.get(i);const o=(()=>b(this,void 0,void 0,(function*(){try{let i=e.children.find((e=>e.name===t&&e.directory));return i||(i=yield e.mkdir(t),i)}finally{this.folderCreationLocks.delete(i)}})))();return this.folderCreationLocks.set(i,o),yield o}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){try{let t=yield this.getRoot();if(e){const i=e.split("/").filter((e=>e));for(const e of i){const i=t.children.find((t=>t.name===e&&t.directory));if(!i)return[];t=i}}return t.children.map((e=>({name:e.name,size:e.size||0,type:e.directory?"folder":"file",modified:e.timestamp?new Date(1e3*e.timestamp).toISOString():""})))}catch(e){return console.error("Error listing MEGA files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return b(this,void 0,void 0,(function*(){try{let t=yield this.getRoot();const i=e.split("/"),o=i.pop();for(const e of i){if(!e)continue;const i=t.children.find((t=>t.name===e&&t.directory));if(!i)return!0;t=i}const r=t.children.find((e=>e.name===o&&!e.directory));return!r||(yield r.delete(),!0)}catch(e){return console.error("Error deleting MEGA file:",e),!1}}))}}class re extends oe{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let r=yield this.getRoot();const s=o.split("/"),n=s.pop()||"";for(const e of s){if(!e)continue;let t=r.children.find((t=>t.name===e&&t.directory));t||(t=yield this.createFolder(r,e)),r=t}const a=r.children.find((e=>e.name===n&&!e.directory));a&&(yield a.delete());const d=t.createReadStream(i.join(this.storagePath,e)),l=t.statSync(i.join(this.storagePath,e)).size;return yield r.upload({name:n,size:l},d).complete,!0}catch(e){return console.error("Error occurred during MEGA file upload:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let r=yield this.getRoot();const s=e.split("/"),n=s.pop()||"";for(const e of s){if(!e)continue;const t=r.children.find((t=>t.name===e&&t.directory));if(!t)return!0;r=t}const a=r.children.find((e=>e.name===n&&!e.directory));if(!a)return!0;const d=t.createWriteStream(i.join(this.storagePath,o));let l=0;return new Promise((e=>{const t=a.download();t.on("data",(e=>{l+=e.length,this.taskQueue.setDownloadedSize(l)})),t.pipe(d),d.on("finish",(()=>e(!0))),d.on("error",(t=>{console.error("Error writing file:",t),e(!1)}))}))}catch(e){return console.error("Error occurred during MEGA file download:",e),!1}}))))))}))}}class se{constructor(e){this.config=e,this.driveId="",this.taskQueue=new E(1),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getDriveId(){return b(this,void 0,void 0,(function*(){if(this.driveId)return this.driveId;const t=this.config.access_token,i=yield e.post("https://openapi.alipan.com/adrive/v1.0/user/getDriveInfo",{},{headers:{Authorization:`Bearer ${t}`}});return this.driveId=i.data.default_drive_id,this.driveId}))}getFolderIdByPath(t){return b(this,void 0,void 0,(function*(){const i=this.config.access_token,o=yield this.getDriveId();try{try{const r=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:t},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});if(r.data)return r.data.file_id}catch(r){const s=t.split("/").filter((e=>e));let n="",a="root";for(const t of s){n+="/"+t;try{a=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:n},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.file_id}catch(r){a=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:o,parent_file_id:a,name:t,type:"folder",check_name_mode:"refuse"},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.file_id}}return a}}catch(e){return console.error("Error getting/creating folder by path:",e),""}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=yield this.getDriveId(),r=yield this.getFolderIdByPath(this.baseFolder+"/"+t);let s=[],n="",a=!0;for(;a;){const t=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/list",{drive_id:o,parent_file_id:r,marker:n||void 0},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}}),d=t.data.items.filter((e=>!e.punish_flag||2!==e.punish_flag))||[];s=s.concat(d),n=t.data.next_marker,a=!!n}return[...new Set(s.map((e=>({name:e.name,size:e.size,type:e.type,modified:e.updated_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=yield this.getDriveId(),r=yield this.getFolderIdByPath(this.baseFolder+"/"+t);return!r||(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/delete",{drive_id:o,file_id:r},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}checkExists(t){var i;return b(this,void 0,void 0,(function*(){try{const o=this.config.access_token,r=yield this.getDriveId(),s=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:r,file_path:t},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}});(null===(i=s.data)||void 0===i?void 0:i.file_id)&&(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/recyclebin/trash",{drive_id:r,file_id:s.data.file_id},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}))}catch(e){}}))}getAuthUrl(e){return`https://openapi.alipan.com/oauth/authorize?${new URLSearchParams({response_type:"code",client_id:L,redirect_uri:e,grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}).toString()}`}}class ne extends se{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token,n=yield this.getDriveId(),a=r.substring(0,r.lastIndexOf("/")),d=r.substring(r.lastIndexOf("/")+1);yield this.deleteFileWithoutQueue(r);const l=yield this.getFolderIdByPath(this.baseFolder+"/"+a),c=i.join(this.storagePath,o),u=yield t.promises.readFile(c),h=u.length,p=y.createHash("sha1").update(u).digest("hex"),f=y.createHash("md5").update(s).digest("hex"),g=Number(BigInt("0x"+f.slice(0,16))%BigInt(h||1)),m=u.slice(g,Math.min(g+8,h)).toString("base64"),v=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:n,parent_file_id:l,name:d,type:"file",check_name_mode:"ignore",size:h,content_hash:p,content_hash_name:"sha1",proof_code:m,proof_version:"v1",part_info_list:[{part_number:1}]},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}),{file_id:k,upload_id:b,rapid_upload:F,part_info_list:w}=v.data;return F?(console.info("阿里云盘秒传成功"),!0):(yield fetch(w[0].upload_url,{method:"PUT",body:u,headers:{"Content-Length":h.toString()}}),yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/complete",{drive_id:n,file_id:k,upload_id:b},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token,n=yield this.getDriveId(),a=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:n,file_path:this.baseFolder+"/"+o},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}})).data.file_id,d=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/getDownloadUrl",{drive_id:n,file_id:a},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}),l=yield e({url:d.data.url,method:"get",responseType:"stream"});let c=0;const u=t.createWriteStream(i.join(this.storagePath,r+".temp"));return l.data.on("data",(e=>{c+=e.length,this.taskQueue.setDownloadedSize(c)})),l.data.pipe(u),new Promise((e=>{u.on("finish",(()=>{t.renameSync(i.join(this.storagePath,r+".temp"),i.join(this.storagePath,r)),e(!0)})),u.on("error",(t=>{console.error("Error occurred during file download:",t),e(!1)}))}))}catch(e){return console.error("Error downloading file:",e),!1}}))))))}))}}class ae{constructor(e){this.baseUrl="https://api.pcloud.com",this.config=e,this.taskQueue=new E(3),this.baseUrl="2"===e.region?"https://eapi.pcloud.com":"https://api.pcloud.com"}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}checkFolderExists(t,i){return b(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:i,path:`/${t}`}})).data.result}catch(e){return console.error("Error checking folder:",e),!1}}))}createFolder(t,i){return b(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/createfolderifnotexists`,{params:{access_token:i,path:`/${t}`}})).data.result}catch(e){return console.error("Error creating folder:",e),!1}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:i,path:"/"+t,recursive:0}});return 0!==o.data.result?[]:o.data.metadata.contents.map((e=>({name:e.name,size:e.size||0,type:e.isfolder?"folder":"file",modified:e.modified})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/deletefile`,{params:{access_token:i,path:"/"+t}});return 0===o.data.result||(console.error("Error deleting file:",o.data),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://my.pcloud.com/oauth2/authorize?client_id=${C}&response_type=code&redirect_uri=${e}`}}class de extends ae{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.refresh_token,n=r.split("/").slice(0,-1).join("/");if(!(yield this.checkFolderExists(n,s))){if(!(yield this.createFolder(n,s)))return!1}const a=i.join(this.storagePath,o),d=t.createReadStream(a),l=t.statSync(a),c=i.basename(o),u=yield e({method:"put",url:`${this.baseUrl}/uploadfile`,params:{access_token:s,path:`/${n}`,renew:1,filename:c},data:d,headers:{"Content-Length":l.size,"Content-Type":"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0});return 0===u.data.result||(console.error("Error uploading file:",u.data),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.refresh_token,n=yield e.get(`${this.baseUrl}/getfilelink`,{params:{access_token:s,path:`/${o}`}});if(0!==n.data.result)return console.error("Error getting file link:",n.data),!1;const a=i.join(this.storagePath,r),d=t.createWriteStream(a),l=`https://${n.data.hosts[0]}${n.data.path}`,c=yield e({method:"get",url:l,responseType:"stream",maxContentLength:1/0,maxBodyLength:1/0});return new Promise((e=>{let t=0;c.data.on("data",(e=>{t+=e.length,this.taskQueue.setDownloadedSize(t)})),c.data.pipe(d),d.on("finish",(()=>{e(!0)})),d.on("error",(t=>{console.error("Error writing file:",t),e(!1)}))}))}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class le{constructor(e){this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=this.baseFolder;t&&""!==t.trim()&&(o=o+"/"+t),o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));let r=[],s=0;const n=1e3;for(;;){const t=yield e.get("https://pan.baidu.com/rest/2.0/xpan/file",{params:{method:"list",access_token:i,dir:"/"+o,start:s,limit:n,order:"name",desc:0,web:1,folder:0},headers:{"User-Agent":"pan.baidu.com"}});if(t.status>=300||0!==t.data.errno){console.error("百度网盘API错误:",t.data);break}const a=t.data.list||[];if(0===a.length)break;if(r=r.concat(a),a.length({name:e.server_filename,size:e.size||0,type:e.isdir?"folder":"file",modified:new Date(1e3*e.server_mtime).toISOString(),path:e.path,fs_id:e.fs_id})))}catch(e){return console.error("获取百度网盘文件列表时发生错误:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=this.baseFolder+"/"+t;o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));const r=new URLSearchParams({async:"0",filelist:JSON.stringify(["/"+o])}),s=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=filemanager&access_token=${i}&opera=delete`,r.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==s.data.errno)return console.error("百度网盘删除文件API错误:",s.data),-9===s.data.errno?console.error("文件不存在"):111===s.data.errno?console.error("有其他异步任务正在执行"):-7===s.data.errno&&console.error("文件名非法"),!1;const n=s.data.info||[];for(const e of n)if(0!==e.errno)return console.error(`文件删除失败: ${e.path}, 错误码: ${e.errno}`),!1;return!0}catch(e){return console.error("删除文件时发生错误:",e),!1}}))}getAuthUrl(e){return`https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=${P}&redirect_uri=${e}&scope=basic,netdisk&device_id=119827642&display=page&qrcode=1`}}const ce=4194304;class ue extends le{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){var s;let n=null;try{const s=this.config.access_token;let a=this.baseFolder+"/"+r;a=a.replace(/\/+/g,"/"),a.startsWith("/")&&(a=a.substring(1));const d=i.join(this.storagePath,o),l=yield this.getFileSize(d),{contentMd5:c,sliceMd5:u,blockList:h}=yield this.calculateFileMd5(d,l),p=new URLSearchParams({path:"/"+a,size:l.toString(),isdir:"0",autoinit:"1",rtype:"3",block_list:JSON.stringify(h),"content-md5":c,"slice-md5":u,local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),g=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=${s}`,p.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==g.data.errno)return console.error("预上传失败:",g.data),-7===g.data.errno?console.error("文件或目录名错误或无权访问"):-10===g.data.errno&&console.error("容量不足"),!1;const y=g.data.uploadid,m=g.data.block_list||[];if(0===m.length)return!0;const v=yield this.getUploadDomain(s,"/"+a,y);if(!v)return console.error("获取上传域名失败"),!1;n=yield t.promises.open(d,"r");for(const t of m){const i=t*ce,o=Math.min(ce,l-i),r=Buffer.alloc(o),{bytesRead:d}=yield n.read(r,0,o,i);if(0===d)break;const c=r.slice(0,d),u=h[t],p=new f;p.append("file",c,{filename:`chunk_${t}`,contentType:"application/octet-stream",knownLength:c.length});const g=`${v}/rest/2.0/pcs/superfile2?method=upload&access_token=${s}&type=tmpfile&path=${encodeURIComponent("/"+a)}&uploadid=${y}&partseq=${t}`,m=yield e.post(g,p,{headers:Object.assign(Object.assign({"User-Agent":"pan.baidu.com"},p.getHeaders()),{"Content-Length":p.getLengthSync().toString()}),maxContentLength:1/0,maxBodyLength:1/0,timeout:0});if(m.status>=300)throw 31024===m.data.errno?console.error("没有申请上传权限"):31299===m.data.errno?console.error("第一个分片的大小小于4MB"):31364===m.data.errno?console.error("超出分片大小限制"):31363===m.data.errno&&console.error("分片缺失"),new Error(`分片上传失败: ${JSON.stringify(m.data)}`);const k=m.data.md5;k&&k!==u&&console.warn(`分片 ${t} MD5不匹配: 期望 ${u}, 实际 ${k}`)}const k=new URLSearchParams({path:"/"+a,size:l.toString(),isdir:"0",block_list:JSON.stringify(h),uploadid:y,rtype:"3",local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),b=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${s}`,k.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});return 0===b.data.errno||(console.error("创建文件失败:",b.data),-7===b.data.errno?console.error("文件或目录名错误或无权访问"):-8===b.data.errno?console.error("文件或目录已存在"):-10===b.data.errno?console.error("云端容量已满"):10===b.data.errno?console.error("创建文件失败,一般是分片问题"):31190===b.data.errno?console.error("文件不存在,一般是分片上传阶段有问题"):31355===b.data.errno?console.error("参数异常,一般是uploadid参数传的有问题"):31365===b.data.errno&&console.error("文件总大小超限"),!1)}catch(e){return console.error("文件上传过程中发生错误:",(null===(s=e.response)||void 0===s?void 0:s.data)||e.message||e),!1}finally{n&&(yield n.close())}}))))))}))}getUploadDomain(t,i,o){return b(this,void 0,void 0,(function*(){try{const r=yield e.get("https://d.pcs.baidu.com/rest/2.0/pcs/file",{params:{method:"locateupload",appid:"250528",access_token:t,path:i,uploadid:o,upload_version:"2.0"},headers:{"User-Agent":"pan.baidu.com"}});if(0!==r.data.error_code)return console.error("获取上传域名失败:",r.data),null;const s=r.data.servers||[],n=s.find((e=>e.server.startsWith("https://")));return n?n.server:s.length>0?s[0].server:(console.error("没有可用的上传服务器"),null)}catch(e){return console.error("获取上传域名时出错:",e),null}}))}calculateFileMd5(e,i){return b(this,void 0,void 0,(function*(){const o=yield t.promises.open(e,"r");try{const e=y.createHash("md5"),t=[];let r="",s=0;for(;sthis.retryOperation((()=>b(this,void 0,void 0,(function*(){var s;this.taskQueue.setDownloadedSize(0);try{const n=this.config.access_token;let a,d=this.baseFolder+"/"+o;d=d.replace(/\/+/g,"/"),d.startsWith("/")&&(d=d.substring(1));let l=yield this.listFileInfos(o.substring(0,o.lastIndexOf("/")));const c=d.split("/").pop(),u=l.find((e=>e.name===c));if(!u)return console.error("文件不存在:",o),!1;const h=yield e.get("https://pan.baidu.com/rest/2.0/xpan/multimedia",{params:{method:"filemetas",access_token:n,fsids:JSON.stringify([u.fs_id]),dlink:1},headers:{"User-Agent":"pan.baidu.com"}});if(0!==h.data.errno||!(null===(s=h.data.list)||void 0===s?void 0:s[0]))return console.error("获取下载链接失败:",h.data),!1;a=h.data.list[0];const p=a.dlink,f=yield e.get(p,{responseType:"stream",params:{access_token:n},headers:{"User-Agent":"pan.baidu.com"}});let g=0;const y=t.createWriteStream(i.join(this.storagePath,r));f.data.on("data",(e=>{g+=e.length,this.taskQueue.setDownloadedSize(g)})),yield new Promise(((e,t)=>{f.data.pipe(y),y.on("finish",(()=>{e()})),y.on("error",t)}));return(yield this.getFileSize(i.join(this.storagePath,r)))===a.size||(console.error("Downloaded file size does not match expected size."),yield t.promises.unlink(i.join(this.storagePath,r)),!1)}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}class he{constructor(e){this.username=e.username,this.password=e.password,this.url=e.url,this.taskQueue=new E(3)}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{return(yield e.get(`${this.url}/list`,{params:{dir:t},auth:{username:this.username,password:this.password}})).data.files.map((e=>({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modifiedTime})))||[]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{return(yield e.delete(`${this.url}/delete`,{params:{dir:t.split("/").slice(0,-1).join("/")||"",filename:t.split("/").pop()},auth:{username:this.username,password:this.password}})).data.success}catch(e){return console.error("Error deleting file:",e),!1}}))}}const pe=o(r.pipeline);class fe extends he{constructor(e){super(e),this.storagePath=e.storagePath}getAuthHeader(){return`Basic ${btoa(`${this.username}:${this.password}`)}`}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{r.split("/").pop();const s=r.substring(0,r.lastIndexOf("/"))||"";let n=this.listFiles("");const a=new Promise(((e,t)=>{setTimeout((()=>t(new Error("Docker connection timeout"))),5e3)}));yield Promise.race([n,a]);const d=t.createReadStream(i.join(this.storagePath,o)),l=new f;l.append("file",d);const c=yield e.post(`${this.url}/upload?dir=${encodeURIComponent(s)}`,l,{headers:Object.assign(Object.assign({},l.getHeaders()),{Authorization:this.getAuthHeader()}),maxContentLength:1/0,maxBodyLength:1/0});return!(c.status>=300)||(console.error("Error occurred during file upload:",c),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=o.split("/").pop()||"",n=o.substring(0,o.lastIndexOf("/"))||"",a=t.createWriteStream(i.join(this.storagePath,r)),d=yield e({url:`${this.url}/download`,method:"GET",params:{dir:n,filename:s},headers:{Authorization:this.getAuthHeader()},maxContentLength:1/0,maxBodyLength:1/0,responseType:"stream"});if(d.status>=300)return console.error("Error occurred during file download:",d),a.destroy(),t.existsSync(i.join(this.storagePath,r))&&t.unlinkSync(i.join(this.storagePath,r)),!1;let l=0;return d.data.on("data",(e=>{l+=e.length,this.taskQueue.setDownloadedSize(l)})),yield pe(d.data,a),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ge{constructor(e){this.baseUrl="https://proapi.115.com",this.config=e,this.taskQueue=new E(1),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getUploadCredentials(t){return b(this,void 0,void 0,(function*(){try{const i=yield e.get(`${this.baseUrl}/open/upload/get_token`,{headers:{Authorization:`Bearer ${t}`}});return i.status>=300||!i.data.state?(console.error("Error getting upload credentials:",i.data),null):i.data.data}catch(e){return console.error("Error occurred during get upload credentials:",e),null}}))}generateOSSPolicy(e,t,i=new Date(Date.now()+36e5)){const o={expiration:i.toISOString(),conditions:[{bucket:e},{key:t},["starts-with","$success_action_status","2"],["content-length-range",0,1073741824]]};return JSON.stringify(o)}getAuthUrl(e){return`https://passportapi.115.com/open/authorize?client_id=${A}&response_type=code&redirect_uri=${e}`}}class ye extends ge{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(e,t){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){var o;try{const o=this.config.access_token;let r=this.baseFolder+"/"+t;r.startsWith("/")||(r="/"+r);let s=i.dirname(r),n=yield this.getFolderInfo(s,!0),a="0";if(n)a=n.file_id;else{let e=yield this.createFolder(s);if(!e)return console.error("Failed to create folder:",s),!1;a=e}const d=i.join(this.storagePath,e),l=yield this.getFileSize(d),c=yield this.calculateFileSha1(d),u=yield this.calculatePreSha1(d),h=i.basename(t);yield this.deleteFileWithoutQueue(t);let p=yield this.initializeUpload(a,h,l,c,u,o);if(!p)return console.error("Failed to initialize upload"),!1;if((6===p.status||7===p.status||8===p.status)&&(p=yield this.handleSecondAuth(a,p,d,h,l,c,u,o),!p))return console.error("Second authentication failed"),!1;if(2===p.status)return console.info(`File ${e} uploaded successfully via instant upload.`),!0;const f=yield this.getUploadCredentials(o);if(!f)return console.error("Failed to get upload credentials"),!1;return(yield this.uploadToObjectStorage(d,p,f))?(console.info(`File ${e} uploaded successfully.`),!0):(console.error("Failed to upload to object storage"),!1)}catch(e){return console.error("Error occurred during file upload:",(null===(o=e.response)||void 0===o?void 0:o.data)||e.message||e),!1}}))))))}))}calculateFileSha1(e){return b(this,void 0,void 0,(function*(){return new Promise(((i,o)=>{const r=y.createHash("sha1"),s=t.createReadStream(e);s.on("data",(e=>{r.update(e)})),s.on("end",(()=>{i(r.digest("hex"))})),s.on("error",(e=>{o(e)}))}))}))}calculatePreSha1(e){return b(this,void 0,void 0,(function*(){return new Promise(((i,o)=>{const r=y.createHash("sha1"),s=t.createReadStream(e,{start:0,end:131071});s.on("data",(e=>{r.update(e)})),s.on("end",(()=>{i(r.digest("hex"))})),s.on("error",(e=>{o(e)}))}))}))}handleSecondAuth(e,i,o,r,s,n,a,d){return b(this,void 0,void 0,(function*(){try{if(!i.sign_check)return console.error("No sign_check provided for second authentication"),null;const[l,c]=i.sign_check.split("-"),u=parseInt(l),h=parseInt(c),p=Buffer.alloc(h-u+1),f=yield t.promises.open(o,"r");try{yield f.read(p,0,p.length,u);const t=y.createHash("sha1");t.update(p);const o=t.digest("hex").toUpperCase();return yield this.initializeUpload(e,r,s,n,a,d,i.sign_key,o,i.pick_code)}finally{yield f.close()}}catch(e){return console.error("Error during second authentication:",e),null}}))}calculateOSSSignature(e,t){const i=Buffer.from(t).toString("base64");return y.createHmac("sha1",e).update(i).digest("base64")}uploadToObjectStorage(o,r,s){var n;return b(this,void 0,void 0,(function*(){try{const n=s.endpoint,a=r.bucket,d=r.object;let l;if(n.includes(a))l=n;else{l=`https://${a}.${n.replace(/^https?:\/\//,"")}`}const c=this.generateOSSPolicy(a,d),u=this.calculateOSSSignature(s.AccessKeySecret,c),h=Buffer.from(c).toString("base64"),p=new f;if(p.append("key",d),p.append("policy",h),p.append("OSSAccessKeyId",s.AccessKeyId),p.append("signature",u),p.append("x-oss-security-token",s.SecurityToken),p.append("success_action_status","200"),r.callback&&r.callback.callback){const e=Buffer.from(r.callback.callback).toString("base64");if(p.append("callback",e),r.callback.callback_var){const e=JSON.parse(r.callback.callback_var);for(const[t,i]of Object.entries(e))p.append(t,String(i))}}const g=t.createReadStream(o);p.append("file",g,i.basename(o));const y=yield e.post(l,p,{headers:Object.assign({},p.getHeaders()),maxContentLength:1/0,maxBodyLength:1/0});return 200===y.status||204===y.status||(console.error("Upload failed with status:",y.status),!1)}catch(e){return console.error("Error uploading file via REST API:",(null===(n=e.response)||void 0===n?void 0:n.data)||e.message||e),!1}}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let s=this.baseFolder+"/"+o;s=s.replace(/\/+/g,"/"),s.startsWith("/")||(s="/"+s);const n=yield this.getFolderInfo(s,!1);if(!n||!n.pick_code)return console.error("Failed to get file info or pick_code for:",o),!1;const a=yield this.getFileDownloadUrl(n.pick_code);if(!a)return console.error("Failed to get download URL for:",o),!1;const d=yield e.get(a.url,{responseType:"stream"});let l=0;const c=t.createWriteStream(i.join(this.storagePath,r));return d.data.on("data",(e=>{l+=e.length,this.taskQueue.setDownloadedSize(l)})),yield new Promise(((e,t)=>{d.data.pipe(c),c.on("finish",(()=>{e()})),c.on("error",t)})),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;(t=this.baseFolder+"/"+t).startsWith("/")||(t="/"+t);let o=[],r=0;const s=1150;let n=!0,a=yield this.getFolderInfo(t,!0),d="";if(a)d=a.file_id;else{let e=yield this.createFolder(t);if(!e)return console.error("Failed to create folder:",t),[];d=e}if(!d)return console.error("Failed to get or create folder ID:",t),[];let l=d;for(;n;){const t={offset:r,limit:s,cur:1,show_dir:1};l&&(t.cid=l);const a=yield e.get(`${this.baseUrl}/open/ufile/files`,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},params:t});if(a.status>=300)break;const d=a.data.data||[];o=o.concat(d),d.length({name:e.fn,size:e.fs||0,type:"0"===e.fc?"folder":"file",modified:new Date(1e3*e.upt).toISOString()})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}getFileDownloadUrl(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=new f;o.append("pick_code",t);const r=yield e.post(`${this.baseUrl}/open/ufile/downurl`,o,{headers:Object.assign({Authorization:`Bearer ${i}`},o.getHeaders())});if(r.status>=300)return console.error("Error getting download URL:",r.data),null;const s=r.data.data,n=Object.keys(s)[0];return n&&s[n]?s[n].url:(console.error("No file data found in download URL response"),null)}catch(e){return console.error("Error occurred during get download URL:",e),null}}))}initializeUpload(t,i,o,r,s,n,a,d,l){return b(this,void 0,void 0,(function*(){try{const c=new f;c.append("file_name",i),c.append("file_size",o.toString()),t?c.append("target","U_1_"+t):c.append("target","U_1_0"),c.append("fileid",r),c.append("preid",s),c.append("topupload","0"),l&&c.append("pick_code",l),a&&c.append("sign_key",a),d&&c.append("sign_val",d);const u=yield e.post(`${this.baseUrl}/open/upload/init`,c,{headers:Object.assign({Authorization:`Bearer ${n}`},c.getHeaders())});return u.status>=300||!u.data.state?(console.error("Error initializing upload:",u.data),null):u.data.data}catch(e){return console.error("Error occurred during upload initialization:",e),null}}))}createFolder(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=t.replace(/^\/+|\/+$/g,"");if(!o)return"";const r=o.split("/");let s="",n="0";for(const t of r){s=s?`${s}/${t}`:t;const o=yield this.getFolderInfo(s,!0);if(o&&o.file_id)n=o.file_id;else{const o=new f;o.append("pid",n),o.append("file_name",t);const r=yield e.post(`${this.baseUrl}/open/folder/add`,o,{headers:Object.assign({Authorization:`Bearer ${i}`},o.getHeaders())});if(r.status>=300||!r.data.state)return console.error("Error creating folder:",r.data),"";n=r.data.data.file_id}}return n}catch(e){return console.error("Error occurred during folder creation:",e),""}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;t=this.baseFolder+"/"+t;let o=yield this.getFolderInfo(t,!1);if(!o)return!0;let r=new f;r.append("file_ids",o.file_id);const s=yield e.post(`${this.baseUrl}/open/ufile/delete`,r,{headers:Object.assign({Authorization:`Bearer ${i}`},r.getHeaders())});return!(s.status>=300||!s.data.state)||(console.error("Error deleting file:",s),!1)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getFolderInfo(t,i){return b(this,void 0,void 0,(function*(){if(""===t||"/"===t)return{file_id:"0"};t.startsWith("/")||(t="/"+t);try{const i=this.config.access_token;let o=new f;o.append("path",t);const r=yield e.post(`${this.baseUrl}/open/folder/get_info`,o,{headers:Object.assign(Object.assign({},o.getHeaders()),{Authorization:`Bearer ${i}`})});return r.status>=300||!r.data.state||0===r.data.data.length?(console.error("Error getting file info:",r.data),null):r.data.data}catch(e){return console.error("Error occurred during get file info:",e),null}}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}const me=()=>{let e="";if("darwin"===process.platform){const o=i.join(m.homedir(),"Library","Mobile Documents","iCloud~com~koodoreader~expo","Documents");t.existsSync(o)&&(e=o)}return e&&t.existsSync(e)&&t.existsSync(e)?e:""};class ve{constructor(e){this.config=e,this.storagePath=e.storagePath,this.taskQueue=new E(5)}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){let s=me();if(!s)return console.error("iCloud Drive path not found"),void r(!1);let n=s+"/"+o,a=s+"/"+i.dirname(o);t.existsSync(a)||t.mkdirSync(a,{recursive:!0}),t.existsSync(n)&&t.unlinkSync(n),t.copyFile(i.join(this.storagePath,e),n,(e=>{e?(console.error("Error uploading file:",e),r(!1)):r(!0)}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){let s=me();if(!s)return console.error("iCloud Drive path not found"),void r(!1);let n=s+"/"+e,a=i.join(this.storagePath,o);if(!t.existsSync(n))return console.error("File does not exist in iCloud:",e),void r(!1);t.existsSync(a)&&t.unlinkSync(a),t.copyFile(n,a,(e=>{if(e)console.error("Error downloading file:",e),r(!1);else{let e=t.statSync(a);this.taskQueue.setDownloadedSize(e.size),r(!0)}}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){const o=()=>new Promise(((o,r)=>b(this,void 0,void 0,(function*(){let r=me();if(!r)return console.error("iCloud Drive path not found"),void o([]);let s=r+"/"+e;t.existsSync(s)||t.mkdirSync(s,{recursive:!0}),t.readdir(s,{withFileTypes:!0},((e,r)=>{if(e)return console.error("Error reading directory:",e),void o([]);let n=r.map((e=>{let o=i.join(s,e.name),r=t.statSync(o);return{name:e.name,size:r.size,type:e.isDirectory()?"folder":"file",modified:r.mtime.toISOString()}}));o(n)}))}))));try{return yield o()}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){try{return yield new Promise(((i,o)=>{let r=me();if(!r)return console.error("iCloud Drive path not found"),void i(!1);let s=r+"/"+e;t.unlink(s,(e=>{e?(console.error("Error deleting file:",e),i(!1)):i(!0)}))}))}catch(e){return console.error(e),!1}}))}}class ke{constructor(e){this.config=e,this.storagePath=e.storagePath,this.drivePath=e.drivePath,this.taskQueue=new E(5)}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void r(!1);let s=this.drivePath+"/"+o,n=this.drivePath+"/"+i.dirname(o);t.existsSync(n)||t.mkdirSync(n,{recursive:!0}),t.existsSync(s)&&t.unlinkSync(s),t.copyFile(i.join(this.storagePath,e),s,(e=>{e?(console.error("Error uploading file:",e),r(!1)):r(!0)}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void r(!1);let s=this.drivePath+"/"+e,n=i.join(this.storagePath,o);if(!t.existsSync(s))return console.error("File does not exist in path:",e),void r(!1);t.existsSync(n)&&t.unlinkSync(n),t.copyFile(s,n,(e=>{if(e)console.error("Error downloading file:",e),r(!1);else{let e=t.statSync(n);this.taskQueue.setDownloadedSize(e.size),r(!0)}}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){const o=()=>new Promise(((o,r)=>b(this,void 0,void 0,(function*(){if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void o([]);let r=this.drivePath+"/"+e;t.existsSync(r)||t.mkdirSync(r,{recursive:!0}),t.readdir(r,{withFileTypes:!0},((e,s)=>{if(e)return console.error("Error reading directory:",e),void o([]);let n=s.map((e=>{let o=i.join(r,e.name),s=t.statSync(o);return{name:e.name,size:s.size,type:e.isDirectory()?"folder":"file",modified:s.mtime.toISOString()}}));o(n)}))}))));try{return yield o()}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){const i=()=>new Promise(((i,o)=>{if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void i(!1);let r=this.drivePath+"/"+e;t.unlink(r,(e=>{e?(console.error("Error deleting file:",e),i(!1)):i(!0)}))}));try{return yield i()}catch(e){return console.error(e),!1}}))}}const be=["book","config","cover","font"];class Fe{constructor(e,t){this.type=e,this.storagePath=t.storagePath,this.remote="dropbox"===e?new D(t):"microsoft"===e?new W(t):"google"===e?new K(t):"microsoft_exp"===e?new W(Object.assign(Object.assign({},t),{isExp:!0})):"google_exp"===e?new K(Object.assign(Object.assign({},t),{isExp:!0})):"s3compatible"===e?new q(t):"webdav"===e?new V(t):"docker"===e?new fe(t):"ftp"===e?new B(t):"sftp"===e?new Z(t):"boxnet"===e?new ie(t):"mega"===e?new re(t):"adrive"===e?new ne(t):"pcloud"===e?new de(t):"dubox"===e?new ue(t):"yandex"===e?new G(t):"yiyiwu"===e?new ye(t):"icloud"===e?new ve(t):"folder"===e?new ke(t):new ee}downloadFile(e,o,r){return b(this,void 0,void 0,(function*(){if(t.existsSync(i.join(this.storagePath+"/"+r))||t.mkdirSync(i.join(this.storagePath+"/"+r)),"cover"!==r){if(!(yield this.listFiles(r)).find((t=>e.indexOf(t)>-1)))return!1}return yield this.remote.downloadFile(r+"/"+e,r+"/"+o)}))}uploadFile(e,o,r){return b(this,void 0,void 0,(function*(){const s=i.join(this.storagePath,r,e);return!(!t.existsSync(s)||0!==t.statSync(s).size)||(yield this.remote.uploadFile(r+"/"+e,r+"/"+o))}))}deleteFile(e,t){return b(this,void 0,void 0,(function*(){return!!(yield this.listFiles(t)).find((t=>e.indexOf(t)>-1))&&(yield this.remote.deleteFile(t+"/"+e))}))}isExist(e,t){return b(this,void 0,void 0,(function*(){return(yield this.listFiles(t)).find((t=>-1!==t.indexOf(e)))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return yield this.remote.listFiles(e)}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){return yield this.remote.listFileInfos(e)}))}downloadAllFiles(){return b(this,void 0,void 0,(function*(){for(let e of be){let t=yield this.listFiles(e);for(let i of t)yield this.downloadFile(i,i,e)}}))}getAuthUrl(e){return this.remote.getAuthUrl(e)}getStats(){return this.remote.taskQueue.getStats()}clearQueue(){return this.remote.taskQueue.clearQueue()}resetCounters(){this.remote.taskQueue.resetCounters()}getDownloadedSize(){return this.remote.taskQueue.getDownloadedSize()}}const we={words:['ALTER TABLE words ADD COLUMN "sentence" text']},Ee={notes:"SELECT * FROM notes WHERE key = ?",bookmarks:"SELECT * FROM bookmarks WHERE key = ?",books:"SELECT * FROM books WHERE key = ?",plugins:"SELECT * FROM plugins WHERE key = ?",words:"SELECT * FROM words WHERE key = ?"},Se={notes:"SELECT * FROM notes WHERE bookKey = ?",bookmarks:"SELECT * FROM bookmarks WHERE bookKey = ?",words:"SELECT * FROM words WHERE bookKey = ?",books:"SELECT * FROM books WHERE key = ?"},Te={notes:"DELETE FROM notes WHERE bookKey = ?",bookmarks:"DELETE FROM bookmarks WHERE bookKey = ?",words:"DELETE FROM words WHERE bookKey = ?"};function Oe(e){for(const t in e)e.hasOwnProperty(t)&&(e[`temp-${t}`]=e[t]);return e}const xe={notes:e=>{let t=Object.assign({},e);return t.date=JSON.parse(e.date),t.tag=JSON.parse(e.tag),t},bookmarks:e=>e,books:e=>e,plugins:e=>{let t=Object.assign({},e);return e.autoValue||delete t.autoValue,e.langList?t.langList=JSON.parse(e.langList):delete t.langList,e.voiceList?t.voiceList=JSON.parse(e.voiceList):delete t.voiceList,t.config=JSON.parse(e.config),t},words:e=>{let t=Object.assign({},e);return t.date=JSON.parse(e.date),void 0===t.sentence&&(t.sentence=""),t}};var Re={sqlStatement:{createTableStatement:Oe({notes:'\n CREATE TABLE IF NOT EXISTS "notes" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "chapter" text,\n "chapterIndex" integer,\n "text" text,\n "cfi" text,\n "range" text,\n "notes" text,\n "percentage" text,\n "color" integer,\n "tag" array\n )\n ',bookmarks:'\n CREATE TABLE IF NOT EXISTS "bookmarks" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "cfi" text,\n "label" text,\n "percentage" text,\n "chapter" text\n );\n ',books:'\n CREATE TABLE IF NOT EXISTS "books" (\n "key" text PRIMARY KEY,\n "name" text,\n "author" text,\n "description" text,\n "md5" text,\n "cover" text,\n "format" text,\n "publisher" text,\n "size" integer,\n "page" integer,\n "path" text,\n "charset" text\n );\n ',plugins:'\n CREATE TABLE IF NOT EXISTS "plugins" (\n "key" text PRIMARY KEY,\n "type" text,\n "displayName" text,\n "icon" text,\n "version" text,\n "config" object,\n "autoValue" string,\n "langList" text,\n "voiceList" text,\n "scriptSHA256" text,\n "script" text\n );\n ',words:'\n CREATE TABLE IF NOT EXISTS "words" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "word" text,\n "sentence" text,\n "chapter" text\n );\n '}),migrateStatement:Oe(we),getAllStatement:Oe({notes:"SELECT * FROM notes",bookmarks:"SELECT * FROM bookmarks",books:"SELECT * FROM books",plugins:"SELECT * FROM plugins",words:"SELECT * FROM words"}),getPagedStatement:Oe({notes:"SELECT * FROM notes LIMIT ? OFFSET ?",bookmarks:"SELECT * FROM bookmarks LIMIT ? OFFSET ?",books:"SELECT * FROM books LIMIT ? OFFSET ?",plugins:"SELECT * FROM plugins LIMIT ? OFFSET ?",words:"SELECT * FROM words LIMIT ? OFFSET ?"}),getCountStatement:Oe({notes:"SELECT COUNT(*) as count FROM notes",bookmarks:"SELECT COUNT(*) as count FROM bookmarks",books:"SELECT COUNT(*) as count FROM books",plugins:"SELECT COUNT(*) as count FROM plugins",words:"SELECT COUNT(*) as count FROM words"}),saveStatement:Oe({notes:"INSERT OR REPLACE INTO notes (key, bookKey, chapter, chapterIndex, text, cfi, range, notes, date, percentage, color, tag) VALUES (@key, @bookKey, @chapter, @chapterIndex, @text, @cfi, @range, @notes, @date, @percentage, @color, @tag)",bookmarks:"INSERT OR REPLACE INTO bookmarks (key, bookKey, cfi, label, percentage, chapter) VALUES (@key, @bookKey, @cfi, @label, @percentage, @chapter)",books:"INSERT OR REPLACE INTO books (key, name, author, description, md5, cover, format, publisher, size, page, path, charset) VALUES (@key, @name, @author, @description, @md5, @cover, @format, @publisher, @size, @page, @path, @charset)",plugins:"INSERT OR REPLACE INTO plugins (key, type, displayName, icon, version, config, autoValue, langList, voiceList, scriptSHA256, script) VALUES (@key, @type, @displayName, @icon, @version, @config, @autoValue, @langList, @voiceList, @scriptSHA256, @script)",words:"INSERT OR REPLACE INTO words (key, bookKey, date, word, sentence, chapter) VALUES (@key, @bookKey, @date, @word, @sentence, @chapter)"}),deleteAllStatement:Oe({notes:"DELETE FROM notes",bookmarks:"DELETE FROM bookmarks",books:"DELETE FROM books",plugins:"DELETE FROM plugins",words:"DELETE FROM words"}),updateStatement:Oe({notes:"UPDATE notes SET bookKey = @bookKey, chapter = @chapter, chapterIndex = @chapterIndex, text = @text, cfi = @cfi, range = @range, notes = @notes, date = @date, percentage = @percentage, color = @color, tag = @tag WHERE key = @key",bookmarks:"UPDATE bookmarks SET bookKey = @bookKey, cfi = @cfi, label = @label, percentage = @percentage, chapter = @chapter WHERE key = @key",books:"UPDATE books SET name = @name, author = @author, description = @description, md5 = @md5, cover = @cover, format = @format, publisher = @publisher, size = @size, page = @page, path = @path, charset = @charset WHERE key = @key",plugins:"UPDATE plugins SET type = @type, displayName = @displayName, icon = @icon, version = @version, config = @config, autoValue = @autoValue, langList = @langList, voiceList = @voiceList, scriptSHA256 = @scriptSHA256, script = @script WHERE key = @key",words:"UPDATE words SET bookKey = @bookKey, date = @date, word = @word, sentence = @sentence, chapter = @chapter WHERE key = @key"}),deleteStatement:Oe({notes:"DELETE FROM notes WHERE key = ?",bookmarks:"DELETE FROM bookmarks WHERE key = ?",books:"DELETE FROM books WHERE key = ?",plugins:"DELETE FROM plugins WHERE key = ?",words:"DELETE FROM words WHERE key = ?"}),dropStatement:Oe({notes:"DROP TABLE IF EXISTS notes",bookmarks:"DROP TABLE IF EXISTS bookmarks",books:"DROP TABLE IF EXISTS books",plugins:"DROP TABLE IF EXISTS plugins",words:"DROP TABLE IF EXISTS words"}),getStatement:Oe(Ee),getByBookKeyStatement:Oe(Se),getByBookKeysStatement:Oe({notes:e=>`SELECT * FROM notes WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,bookmarks:e=>`SELECT * FROM bookmarks WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,words:e=>`SELECT * FROM words WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")})`}),getKeysStatement:Oe({notes:"SELECT key FROM notes",bookmarks:"SELECT key FROM bookmarks",books:"SELECT key FROM books",plugins:"SELECT key FROM plugins",words:"SELECT key FROM words"}),getWithSortAndPageStatement:Oe({notes:(e,t,i,o)=>`SELECT * FROM notes ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,bookmarks:(e,t,i,o)=>`SELECT * FROM bookmarks ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,books:(e,t,i,o)=>`SELECT * FROM books ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,plugins:(e,t,i,o)=>`SELECT * FROM plugins ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,words:(e,t,i,o)=>`SELECT * FROM words ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`}),getByKeysStatement:Oe({notes:e=>`SELECT * FROM notes WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,bookmarks:e=>`SELECT * FROM bookmarks WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,plugins:e=>`SELECT * FROM plugins WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,words:e=>`SELECT * FROM words WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`}),deleteByBookKeyStatement:Oe(Te)},jsonToSqlite:Oe({notes:e=>{let t=Object.assign({},e);return t.date=JSON.stringify(e.date),t.tag=JSON.stringify(e.tag),t},bookmarks:e=>e,books:e=>{let t=Object.assign({},e);return t.page=e.page||0,t},plugins:e=>{let t=Object.assign({},e);return e.autoValue||(t.autoValue=null),e.langList?t.langList=JSON.stringify(e.langList):t.langList=null,e.voiceList?t.voiceList=JSON.stringify(e.voiceList):t.voiceList=null,t.config=JSON.stringify(e.config),t},words:e=>{let t=Object.assign({},e);return t.date=JSON.stringify(e.date),void 0===t.sentence&&(t.sentence=""),t}}),sqliteToJson:Oe(xe)};const Ce=S,_e=T;class Pe{constructor(e,t,i){this.TokenService=e,this.ConfigService=t,this.baseUrl="china"===i?_e:Ce,this.serverRegion=i,this.refreshToken="",this.accessToken="",this.streamPromise=null,this.expiresAt=0}refreshUserToken(){return b(this,void 0,void 0,(function*(){if(this.refreshToken=yield this.TokenService.getToken("refresh_token"),!this.refreshToken)return{code:401,message:"refresh token not found"};let t=(yield e.post(this.baseUrl+"/api/v1/public/user/refresh_token",{refresh_token:this.refreshToken})).data;return 200===t.code&&(yield this.TokenService.setToken("access_token",t.data.access_token),yield this.TokenService.setToken("refresh_token",t.data.refresh_token),yield this.TokenService.setToken("expires_at",(1e3*t.data.expires_at).toString()),this.accessToken=t.data.access_token,this.refreshToken=t.data.refresh_token,this.expiresAt=1e3*t.data.expires_at),t}))}requestWithRetry(e){return b(this,void 0,void 0,(function*(){return Pe.requestQueue||(Pe.requestQueue=[]),new Promise(((t,i)=>{Pe.requestQueue.push({config:e,resolve:t,reject:i}),Pe.processingQueue||this.processQueue()}))}))}isTokenValid(){return b(this,void 0,void 0,(function*(){if(this.accessToken||(this.accessToken=(yield this.TokenService.getToken("access_token"))||""),!this.expiresAt){const e=yield this.TokenService.getToken("expires_at");this.expiresAt=e?parseInt(e):(new Date).getTime()+31536e9}return""!==this.accessToken&&this.expiresAt>(new Date).getTime()+6e4}))}processQueue(){return b(this,void 0,void 0,(function*(){if(!Pe.processingQueue){Pe.processingQueue=!0;try{for(;Pe.requestQueue.length>0;){const e=Pe.requestQueue.shift();try{let t=yield this.executeRequest(e.config);e.resolve(t)}catch(t){e.reject(t)}}}finally{Pe.processingQueue=!1}}}))}executeRequest(t){return b(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let i="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);if(t.baseURL=this.baseUrl,t.headers)t.headers.Authorization="Bearer "+this.accessToken,t.headers["X-Request-ID"]=i;else{let e=this.ConfigService.getItem("appVersion"),o=this.ConfigService.getItem("appPlatform");t.headers={Authorization:"Bearer "+this.accessToken,"X-Request-ID":i,"X-App-Version":e||"1.0.0","X-App-Platform":o||"web"}}let o=(yield e(t)).data;if(402===o.code){let i=yield this.refreshUserToken();if(200===i.code){return t.headers=t.headers||{},t.headers.Authorization="Bearer "+this.accessToken,(yield e(t)).data}return i}return 200!==o.code&&console.error("Request error:",o),o}catch(e){return console.error("Request execution error:",e),"Network Error"===e.message?{code:503,message:"network error",data:null,msg:"Network error, please try again later. 网络错误,请稍后再试。"}:{code:500,message:e.message||"Unknown error",msg:e.message||"Unknown error",data:null}}}))}requestWithStream(e,t,i){return b(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>b(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let o=this.accessToken||"",r="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((s,n)=>{let a=this.ConfigService.getItem("appVersion"),d=this.ConfigService.getItem("appPlatform");const l=new i(this.baseUrl+e.url,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+o,"X-Request-ID":r,"X-App-Version":a||"1.0.0","X-App-Platform":d||"web"},method:e.method,body:JSON.stringify(e.data),pollingInterval:0});l.addEventListener("open",(()=>{console.info("Connection to OpenAI established.")})),l.addEventListener("message",(e=>b(this,void 0,void 0,(function*(){if(!e.data)return;const i=JSON.parse(e.data);i.done?(l.close(),s(i)):t(i.data)})))),l.addEventListener("error",(e=>{if(console.info("Error:",e),!e.data)return;const t=JSON.parse(e.data);s(t),l.close()}))}))}finally{this.streamPromise=null}})))()),this.streamPromise}))}requestWithFetch(e,t){return b(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>b(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let i=this.accessToken||"",o="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((r,s)=>b(this,void 0,void 0,(function*(){let s=this.ConfigService.getItem("appVersion"),n=this.ConfigService.getItem("appPlatform");var a=new v(this.baseUrl+e.url,{headers:{"Content-Type":"text/plain",Authorization:"Bearer "+i,"X-Request-ID":o,"X-App-Version":s||"1.0.0","X-App-Platform":n||"web"},payload:JSON.stringify(e.data),method:"POST"});a.addEventListener("message",(e=>b(this,void 0,void 0,(function*(){if(!e.data)return;const i=JSON.parse(e.data);i.done?(a.close(),r(i)):t(i.data)})))),a.addEventListener("open",(e=>{console.info(e,"Connection to OpenAI established.")})),a.addEventListener("error",(e=>{if(console.error(e,"Error occurred while connecting to OpenAI"),!e.data)return;const t=JSON.parse(e.data);r(t),a.close()}))}))))}finally{this.streamPromise=null}})))()),this.streamPromise}))}}Pe.processingQueue=!1,Pe.requestQueue=[];class Ae extends Pe{constructor(e,t,i){super(e,t,i),this.serverRegion=i}encryptToken(e){return b(this,void 0,void 0,(function*(){let t=e.token,i=w.encode(t),{extracted:o,remaining:r}=function(e){let t="",i="",o=[],r=1;for(;r<=e.length;)o.push(r-1),r*=2;for(let r=0;r-1){let i=t.split("#");e.encrypted_token=i[1]}const i={method:"post",url:"/api/v1/pro/thirdparty/decrypt_token",data:e};let o=yield this.requestWithRetry(i);if(t.indexOf("#")>-1&&o.data&&o.data.token){let e=t.split("#"),i=function(e,t){let i="",o=[],r=1,s=e.length+t.length;for(;r<=s;)o.push(r-1),r*=2;let n=0,a=0;for(let r=0;r-1&&i.splice(o,1),this.setAllListConfig(i,t)}static setListConfig(e,t){let i=this.getAllListConfig(t);const o=i.indexOf(e);o>-1?(i.splice(o,1),i.unshift(e)):i.unshift(e),this.setAllListConfig(i,t)}static setAllListConfig(e,t,i=!0){this.setItem(t,JSON.stringify(e)),i&&this.setSyncRecord({type:"config",catergory:"listConfig",name:"general",key:t},{operation:"update",time:Date.now()})}static setObjectConfig(e,t,i,o=!0){let r=this.getAllObjectConfig(i);r[e]=t,o&&this.setSyncRecord({type:"config",catergory:"objectConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllObjectConfig(r,i)}static getObjectConfig(e,t,i){return this.getAllObjectConfig(t)[e]||i}static getAllObjectConfig(e){let t=this.getItem(e);return JSON.parse(t)||{}}static setAllObjectConfig(e,t){this.setItem(t,JSON.stringify(e))}static deleteObjectConfig(e,t){let i=this.getAllObjectConfig(t);delete i[e],this.setSyncRecord({type:"config",catergory:"objectConfig",name:t,key:e},{operation:"delete",time:Date.now()}),this.setAllObjectConfig(i,t)}static getAllMapConfig(e){let t=this.getItem(e);return JSON.parse(t)||{}}static getMapConfig(e,t){return this.getAllMapConfig(t)[e]||[]}static setAllMapConfig(e,t){this.setItem(t,JSON.stringify(e))}static setMapConfig(e,t,i){let o=this.getAllMapConfig(i);void 0===o[e]&&(o[e]=[]),t&&-1===o[e].indexOf(t)&&o[e].unshift(t),this.setSyncRecord({type:"config",catergory:"mapConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,i)}static setOneMapConfig(e,t,i,o=!0){let r=this.getAllMapConfig(i);r[e]=t,o&&this.setSyncRecord({type:"config",catergory:"mapConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(r,i)}static deleteFromMapConfig(e,t,i){let o=this.getAllMapConfig(i),r=o[e].indexOf(t);o[e].splice(r,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,i)}static deleteFromAllMapConfig(e,t){let i=this.getAllMapConfig(t);Object.keys(i).forEach((o=>{let r=i[o].indexOf(e);r>-1&&(i[o].splice(r,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:o},{operation:"update",time:Date.now()}))})),this.setAllMapConfig(i,t)}static deleteMapConfig(e,t){let i=this.getAllMapConfig(t);delete i[e],this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"delete",time:Date.now()}),this.setAllMapConfig(i,t)}static getFromAllMapConfig(e,t){let i=this.getAllMapConfig(t),o=[];for(let t in i)i[t]&&i[t].indexOf(e)>-1&&o.push(t);return o}static getSyncRecord(e){return JSON.parse(this.getItem("syncRecord")||"{}")[e.type+"."+e.catergory+"."+e.name+"."+e.key]||{operation:"",time:0}}static getAllSyncRecord(){return JSON.parse(this.getItem("syncRecord")||"{}")}static setSyncRecord(e,t){const i=e.type+"."+e.catergory+"."+e.name+"."+e.key;let o=JSON.parse(this.getItem("syncRecord")||"{}");o[i]=t,this.setItem("syncRecord",JSON.stringify(o))}static setAllSyncRecord(e){this.setItem("syncRecord",JSON.stringify(e))}});var Le,ze;export{$e as ConfigService,Re as SqlStatement,Fe as SyncUtil,Ae as ThirdpartyRequest}; +import e from"axios";import t from"fs";import i from"path";import{promisify as o}from"util";import r from"stream";import{Client as s}from"basic-ftp";import{S3Client as n,ListObjectsV2Command as a,DeleteObjectCommand as d,PutObjectCommand as l,GetObjectCommand as c}from"@aws-sdk/client-s3";import{AuthType as u,createClient as h}from"webdav";import p from"ssh2-sftp-client";import f from"form-data";import{Storage as g}from"megajs";import y from"crypto";import m from"os";import{SSE as v}from"sse.js";import k from"electron-store";function b(e,t,i,o){return new(i||(i=Promise))((function(r,s){function n(e){try{d(o.next(e))}catch(e){s(e)}}function a(e){try{d(o.throw(e))}catch(e){s(e)}}function d(e){var t;e.done?r(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(n,a)}d((o=o.apply(e,t||[])).next())}))}const F=e=>"json"===e?"application/json":["jpg","jpeg","png","gif","bmp"].includes(e)?"image/"+e:"zip"===e?"application/zip":"epub"===e?"application/epub+zip":"txt"===e?"text/plain":"pdf"===e?"application/pdf":"mobi"===e?"application/x-mobipocket-ebook":"azw3"===e||"azw"===e?"application/vnd.amazon.ebook":"cbz"===e?"application/x-cbz":"cbr"===e?"application/x-cbr":"cbt"===e?"application/x-cbt":"cb7"===e?"application/x-cb7":"fb2"===e?"application/x-fictionbook+xml":"html"===e?"text/html":"css"===e?"text/css":"js"===e?"application/javascript":"xml"===e?"application/xml":"xhtml"===e?"application/xhtml+xml":"opf"===e?"application/oebps-package+xml":"ncx"===e?"application/x-dtbncx+xml":"mp3"===e?"audio/mpeg":"wav"===e?"audio/wav":"ogg"===e?"audio/ogg":"mp4"===e?"video/mp4":"webm"===e?"video/webm":"avi"===e?"video/x-msvideo":"wmv"===e?"video/x-ms-wmv":"flv"===e?"video/x-flv":"m3u8"===e?"application/x-mpegURL":"ts"===e?"video/MP2T":"3gp"===e?"video/3gpp":"3g2"===e?"video/3gpp2":"db"===e?"application/x-sqlite3":void 0,w={_chars:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",encode(e){if("string"!=typeof e)throw new Error("Input must be a string");let t="",i=0;const o=this._stringToUtf8Bytes(e),r=o.length;for(;i>2,d=(3&e)<<4|s>>4,l=(15&s)<<2|n>>6,c=63&n;t+=this._chars.charAt(a),t+=this._chars.charAt(d),t+=i-2>=r?"=":this._chars.charAt(l),t+=i-1>=r?"=":this._chars.charAt(c)}return t},decode(e){if("string"!=typeof e)throw new Error("Input must be a string");for(e=e.replace(/[^A-Za-z0-9+/]/g,"");e.length%4!=0;)e+="=";const t=[];let i=0;const o=e.length;for(;i>4,d=(15&r)<<4|s>>2,l=(3&s)<<6|n;t.push(a),-1!==s&&t.push(d),-1!==n&&t.push(l)}return this._utf8BytesToString(t)},_stringToUtf8Bytes(e){const t=[];for(let i=0;i>6),t.push(128|63&o);else if(55296==(64512&o)&&i+1>18),t.push(128|e>>12&63),t.push(128|e>>6&63),t.push(128|63&e)}else t.push(239,191,189),i--}else t.push(224|o>>12),t.push(128|o>>6&63),t.push(128|63&o)}return t},_utf8BytesToString(e){let t="",i=0;for(;i65535){const i=e-65536;t+=String.fromCharCode(55296|i>>10),t+=String.fromCharCode(56320|1023&i)}else t+=String.fromCharCode(e)}else t+="�"}else t+="�"}return t},encodeURL(e){return this.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")},decodeURL(e){for(e=e.replace(/-/g,"+").replace(/_/g,"/");e.length%4;)e+="=";return this.decode(e)}};class E{constructor(e){this.queue=[],this.runningTasks=0,this.totalTasks=0,this.completedTasks=0,this.hasFailedTasks=!1,this.downloadedSize=0,this.maxConcurrency=e}addTask(e){return b(this,void 0,void 0,(function*(){return this.totalTasks++,new Promise(((t,i)=>{if(this.hasFailedTasks)return void t(void 0);const o=()=>b(this,void 0,void 0,(function*(){if(this.hasFailedTasks)return this.completedTasks++,void t(void 0);try{this.runningTasks++;const i=yield e();return this.completedTasks++,t(i),i}catch(e){throw this.completedTasks++,i(e),e}finally{this.runningTasks--,this.runNext()}}));this.runningTasks0;){const e=this.queue.shift();e&&e()}else if(this.queue.length>0&&this.runningTasks=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=[],r=!0,s=null;for(;r;){let n;n=s?yield e.post("https://api.dropboxapi.com/2/files/list_folder/continue",{cursor:s},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}}):yield e.post("https://api.dropboxapi.com/2/files/list_folder",{path:"/"+t,limit:2e3},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});const a=n.data.entries||[];o=o.concat(a),r=n.data.has_more,s=n.data.cursor}return[...new Set(o.map((e=>({name:e.name,size:e.size||0,type:e[".tag"],modified:e.client_modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;yield e.post("https://api.dropboxapi.com/2/files/delete_v2",{path:"/"+t},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});return!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://www.dropbox.com/oauth2/authorize?response_type=code&token_access_type=offline&client_id=${x}&redirect_uri=${e}`}}const j=o(r.pipeline);class D extends Q{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token,n=t.createReadStream(i.join(this.storagePath,o));return yield e.post("https://content.dropboxapi.com/2/files/upload",n,{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/octet-stream","Dropbox-API-Arg":JSON.stringify({path:"/"+r,mode:"overwrite",autorename:!0,mute:!1})},maxContentLength:1/0,maxBodyLength:1/0}),!0}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token,n=t.createWriteStream(i.join(this.storagePath,r)),a=yield e({url:"https://content.dropboxapi.com/2/files/download",method:"GET",responseType:"stream",headers:{Authorization:`Bearer ${s}`,"Dropbox-API-Arg":JSON.stringify({path:"/"+o})},maxContentLength:1/0,maxBodyLength:1/0});let d=0;return a.data.on("data",(e=>{d+=e.length,this.taskQueue.setDownloadedSize(d)})),yield j(a.data,n),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class B{constructor(e){this.config=e,this.storagePath=e.storagePath,this.taskQueue=new E(1),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getClient(){return b(this,void 0,void 0,(function*(){try{if(this.client&&!1===this.client.closed)return this.client;let{url:e,username:t,password:i,dir:o,ssl:r,port:n}=this.config;const a=new s(0);a.ftp.verbose=!0;const d=a.access({host:e,port:parseInt(n),user:t,password:i,secure:"1"===r}),l=new Promise(((e,t)=>{setTimeout((()=>t(new Error("FTP connection timeout"))),5e3)}));return yield Promise.race([d,l]),this.client=a,a}catch(e){throw console.error("Error connecting to FTP server:",e),this.client=null,e}}))}uploadFile(e,t){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let{dir:o}=this.config;o=o&&"KoodoReader"===this.baseFolder?o:this.baseFolder;const r=yield this.getClient(),s=()=>b(this,void 0,void 0,(function*(){yield r.ensureDir(i.dirname(o+"/"+t)),yield r.cd("/"),yield r.uploadFrom(i.join(this.storagePath,e),o+"/"+t)}));try{return yield s(),!0}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let{dir:r}=this.config;r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder;const s=yield this.getClient(),n=t.createWriteStream(i.join(this.storagePath,o)),a=()=>b(this,void 0,void 0,(function*(){s.trackProgress((e=>{this.taskQueue.setDownloadedSize(e.bytes||0)})),yield s.downloadTo(n,r+"/"+e),s.trackProgress()}));try{return yield a(),!0}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.listFilesWithoutQueue(e)}))))))}))}listFilesWithoutQueue(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;const i=yield this.getClient(),o=()=>b(this,void 0,void 0,(function*(){return yield i.list(t+"/"+e)}));try{return(yield o()).map((e=>({name:e.name,size:e.size||0,type:e.isFile?"file":"folder",modified:e.modifiedAt?e.modifiedAt.toISOString():""})))}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;const i=yield this.getClient(),o=()=>b(this,void 0,void 0,(function*(){yield i.remove(t+"/"+e)}));try{return yield o(),!0}catch(e){return console.error(e),!1}}))}}class M{constructor(e){this.isExp=!1,this.baseUrl="https://graph.microsoft.com/v1.0/me/drive/special/approot",this.config=e,this.taskQueue=new E(3),this.isExp=this.config.isExp||!1,this.baseUrl=this.isExp?"https://graph.microsoft.com/v1.0/me/drive/root":"https://graph.microsoft.com/v1.0/me/drive/special/approot",void 0===this.config.baseFolder?this.baseFolder=this.isExp?"KoodoReader":"":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);let o,r=[];if(""===t)o=`${this.baseUrl}/children`;else{const e=encodeURIComponent(t);o=`${this.baseUrl}:/${e}:/children`}for(;o;){const t=yield e.get(o,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});if(t.status>=300)break;const s=t.data.value||[];r=r.concat(s),o=t.data["@odata.nextLink"]||""}return[...new Set(r.map((e=>({name:e.name,size:e.size||0,type:e.folder?"folder":"file",modified:e.lastModifiedDateTime}))))]}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);const o=yield e.delete(`${this.baseUrl}:/${t}`,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});return!(o.status>=300)||(console.error("Error deleting file:",o),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${I}&scope=${this.isExp?"files.readwrite.all":"files.readwrite.appfolder"} offline_access&response_type=code&redirect_uri=${e}`}}const U=209715200;class W extends M{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){var s;let n=null;try{const s=this.config.access_token;let a=this.baseFolder+"/"+r;for(;a.startsWith("/");)a=a.substring(1);const d=i.join(this.storagePath,o),l=yield this.getFileSize(d),c=a.split(".").pop(),u=(F(c||""),`${this.baseUrl}:/${a}:/createUploadSession`),h=(yield e.post(u,{item:{"@microsoft.graph.conflictBehavior":"replace"}},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}})).data.uploadUrl;n=yield t.promises.open(d,"r");let p=0,f=Buffer.alloc(U);for(;pthis.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token;let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const a=`${this.baseUrl}:/${n}:/content`;let d=(yield fetch(a,{headers:{Authorization:"Bearer "+s},redirect:"manual"})).headers.get("location");if(d){const o=yield e.get(d,{responseType:"stream"});let s=0;const n=t.createWriteStream(i.join(this.storagePath,r));return o.data.on("data",(e=>{s+=e.length,this.taskQueue.setDownloadedSize(s)})),yield new Promise(((e,t)=>{o.data.pipe(n),n.on("finish",(()=>{e()})),n.on("error",t)})),!0}return!1}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}class N{constructor(e){this.isExp=!1,this.folderIdCache=new Map,this.config=e,this.taskQueue=new E(3),this.isExp=this.config.isExp||!1,this.baseFolder="KoodoReader"}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getFileId(t,i){return b(this,void 0,void 0,(function*(){const o=this.config.access_token,r=`https://www.googleapis.com/drive/v3/files?q=name='${t}'+and+'${i}'+in+parents&fields=files(id,name)`;try{const t=yield e.get(r,{headers:{Authorization:"Bearer "+o}});if(0===t.data.files.length)return"";const i=t.data.files;return i.length>0?i[0].id:null}catch(e){return console.error("Error occurred during file list retrieval:",e),""}}))}checkFolder(t){return b(this,void 0,void 0,(function*(){t=this.baseFolder+"/"+t;const i=this.config.access_token;if(""===t)return"root";if(this.folderIdCache.has(t))return this.folderIdCache.get(t);const o=t.split("/").filter((e=>""!==e.trim()));let r="root",s="";for(const t of o){if(s=s?s+"/"+t:t,this.folderIdCache.has(s)){r=this.folderIdCache.get(s);continue}let o=yield this.getFolderId(t,r);if(!o){const s={name:t,mimeType:"application/vnd.google-apps.folder",parents:[r]};try{o=(yield e.post("https://www.googleapis.com/drive/v3/files",s,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.id}catch(e){throw console.error(`Error occurred during folder creation for ${t}:`,e),e}}this.folderIdCache.set(s,o),r=o}return r}))}getFolderId(t,i){return b(this,void 0,void 0,(function*(){const o=this.config.access_token,r=`https://www.googleapis.com/drive/v3/files?q=name='${t=encodeURIComponent(t)}'+and+mimeType='application/vnd.google-apps.folder'+and+'${i}'+in+parents&fields=files(id,name)`;try{const t=(yield e.get(r,{headers:{Authorization:`Bearer ${o}`}})).data.files;return t.length>0?t[0].id:null}catch(e){throw console.error("Error occurred during fetching folder ID:",e),e}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=yield this.checkFolder(t),r=[],s="",n=!0;for(;n;){let t=`https://www.googleapis.com/drive/v3/files?q='${o}'+in+parents&fields=nextPageToken,files(id,name,size,mimeType)&pageSize=1000`;s&&(t+=`&pageToken=${s}`);const a=yield e.get(t,{headers:{Authorization:`Bearer ${i}`}}),d=a.data.files||[];r=r.concat(d),s=a.data.nextPageToken,n=!!s}return[...new Set(r.map((e=>({name:e.name,size:e.size||0,type:"application/vnd.google-apps.folder"===e.mimeType?"folder":"file",modified:e.modifiedTime}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQue(e)}))))))}))}deleteFileWithoutQue(t){return b(this,void 0,void 0,(function*(){const i=t.split("/").pop()||"",o=t.split("/").slice(0,-1).join("/"),r=yield this.checkFolder(o),s=this.config.access_token,n=yield this.getFileId(i,r);if(""===n)return console.error("File not found:",i),!0;try{const t=yield e.delete(`https://www.googleapis.com/drive/v3/files/${n}`,{headers:{Authorization:`Bearer ${s}`}});return console.error("File deleted:",t),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${e}&prompt=consent&response_type=code&client_id=${$}&scope=https://www.googleapis.com/auth/${this.isExp?"drive":"drive.file"}&access_type=offline`}}class K extends N{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token;let n=o.split("/").pop(),a=r.split(".").pop(),d=F(a||""),l=r.split("/").slice(0,-1).join("/"),c=yield this.checkFolder(l),u=yield this.getFileId(n||"",c);const h={mimeType:d,name:n,parents:[c]},p=u?`https://www.googleapis.com/upload/drive/v3/files/${u}?uploadType=resumable`:"https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable",f=(yield e({method:u?"PATCH":"POST",url:p,data:u?null:JSON.stringify(h),headers:{Authorization:"Bearer "+s,"Content-Type":"application/json; charset=UTF-8"},maxContentLength:1/0,maxBodyLength:1/0})).headers.location;let g=yield this.getFileSize(i.join(this.storagePath,o));const y=t.createReadStream(i.join(this.storagePath,o));yield e.put(f,y,{headers:{Authorization:"Bearer "+s,"Content-Type":"application/zip","Content-Range":`bytes 0-${g-1}/${g}`},maxContentLength:1/0,maxBodyLength:1/0});return!0}catch(e){return console.error("Error occurred during upload:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token;let n=o.split("/").pop(),a=o.split("/").slice(0,-1).join("/"),d=yield this.checkFolder(a),l=yield this.getFileId(n||"",d);if(!l)return console.error("File not found"),!0;const c=`https://www.googleapis.com/drive/v3/files/${l}?alt=media`;return new Promise((o=>{const n=t.createWriteStream(i.join(this.storagePath,r));e({url:c,method:"GET",responseType:"stream",headers:{Authorization:"Bearer "+s},maxContentLength:1/0,maxBodyLength:1/0}).then((e=>{let t=0;e.data.on("data",(e=>{t+=e.length,this.taskQueue.setDownloadedSize(t)})),e.data.pipe(n),n.on("finish",(()=>{o(!0)})),n.on("error",(()=>{o(!1)}))})).catch((e=>{console.error("Error downloading file:",e),o(!1)}))}))}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}class H{constructor(e){this.config=e,this.taskQueue=new E(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}shouldUsePathStyle(){try{if(this.config.forcePathStyle&&"no"!==this.config.forcePathStyle)return!0;let e=this.config.endpoint;const t=new URL(e),i=t.hostname,o=/^(\d{1,3}\.){3}\d{1,3}$/.test(i),r=""!==t.port;return!o&&r}catch(e){return!0}}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:o,accessKeyId:r,secretAccessKey:s,dir:d}=this.config;d=d&&"KoodoReader"===this.baseFolder?d:this.baseFolder;let l=d+"/"+e;for(;l.startsWith("/");)l=l.substring(1);""===l||l.endsWith("/")||(l+="/");const c=new n({endpoint:t,region:i,credentials:{accessKeyId:r,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});try{let e,t=[],i=[],r=!0;for(;r;){const s=yield c.send(new a({Bucket:o,Prefix:l,Delimiter:"/",ContinuationToken:e}));s.Contents&&(t=t.concat(s.Contents)),s.CommonPrefixes&&(i=i.concat(s.CommonPrefixes)),e=s.NextContinuationToken,r=!!e}let s=[];return t.forEach((e=>{if(!e.Key.endsWith("/")){const t=e.Key.substring(l.length);t.includes("/")||s.push({name:t,size:e.Size||0,type:"file",modified:e.LastModified?e.LastModified.toISOString():""})}})),i.forEach((e=>{const t=e.Prefix.substring(l.length).replace(/\/$/,"");t&&s.push({name:t,size:0,type:"folder",modified:""})})),s}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:o,accessKeyId:r,secretAccessKey:s,dir:a}=this.config;a=a&&"KoodoReader"===this.baseFolder?a:this.baseFolder;const l=new n({endpoint:t,region:i,credentials:{accessKeyId:r,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});let c=a+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{return yield l.send(new d({Bucket:o,Key:c})),!0}catch(e){return console.error(e),!1}}))}}class q extends H{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){let{endpoint:r,region:s,bucketName:a,accessKeyId:d,secretAccessKey:c,dir:u}=this.config;const h=new n({endpoint:r,region:s,credentials:{accessKeyId:d,secretAccessKey:c},forcePathStyle:this.shouldUsePathStyle()});u=u&&"KoodoReader"===this.baseFolder?u:this.baseFolder;let p=u+"/"+o;for(;p.startsWith("/");)p=p.substring(1);try{let o=yield h.send(new l({Bucket:a,Key:p,Body:t.createReadStream(i.join(this.storagePath,e))}));return 200===o.$metadata.httpStatusCode||(console.error("Error uploading file:",o),!1)}catch(e){return console.error("Error: ",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let{endpoint:r,region:s,bucketName:a,accessKeyId:d,secretAccessKey:l,dir:u}=this.config;u=u&&"KoodoReader"===this.baseFolder?u:this.baseFolder;const h=(e,t,i,o)=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){const s=yield e.send(new c({Bucket:t,Key:i}));let n=0;s.Body?(s.Body.on("data",(e=>{n+=e.length,this.taskQueue.setDownloadedSize(n)})),s.Body.pipe(o),o.on("finish",(e=>{e&&r(!1),r(!0)}))):r(!1)})))),p=()=>new Promise(((c,p)=>{const f=new n({region:s,endpoint:r,credentials:{accessKeyId:d,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});let g=t.createWriteStream(i.join(this.storagePath,o)),y=u+"/"+e;for(;y.startsWith("/");)y=y.substring(1);h(f,a,y,g).then((e=>{c(!0)})).catch((e=>{console.error(e),c(!1)}))}));try{return yield p()}catch(e){return console.error(e),!1}}))))))}))}}class J{constructor(e){let{username:t,password:i,url:o,dir:r,AuthType:s,createClient:n}=e;void 0===e.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=e.baseFolder,r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder,this.username=t,this.password=i,this.url=o,this.dir=r,this.taskQueue=new E(5),this.AuthType=s,this.createClient=n}getClient(){return b(this,void 0,void 0,(function*(){return this.webdavClient||(this.url=yield this.handleUrlRedirection(this.url),this.webdavClient=this.createClient(this.url,{authType:this.AuthType.Password,username:this.username,password:this.password})),this.webdavClient}))}handleUrlRedirection(t){return b(this,void 0,void 0,(function*(){try{const i=yield e.head(t,{maxRedirects:0,validateStatus:()=>!0,timeout:5e3});return i.request&&i.request.responseURL&&i.request.responseURL!==t?i.request.responseURL:i.status>=300&&i.status<400&&i.headers.location?i.headers.location:t}catch(e){return console.info("Error handling URL redirection:",e),t}}))}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){const t=yield this.getClient();try{const i=t.getDirectoryContents(this.dir+"/"+e),o=new Promise(((e,t)=>{setTimeout((()=>t(new Error("WebDAV list directory timeout"))),5e3)}));return(yield Promise.race([i,o])).filter((t=>"."!==t.filename&&".."!==t.filename&&t.filename!==e)).map((e=>({name:e.basename,size:e.size||0,type:"directory"===e.type?"folder":"file",modified:e.lastmod})))}catch(i){return i.response&&404===i.response.status&&(yield t.createDirectory(this.dir+"/"+e)),console.error("Error listing files:",i),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){const t=yield this.getClient();try{return yield t.deleteFile(this.dir+"/"+e),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(e){return b(this,void 0,void 0,(function*(){let t=yield this.getClient();try{const i=e.replace(/^\/+|\/+$/g,"").split("/").filter((e=>e.length>0));let o="";for(const e of i)o=o?`${o}/${e}`:e,(yield t.exists(`/${o}`))||(yield t.createDirectory(`/${o}`));return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}}class V extends J{constructor(e){super(Object.assign(Object.assign({},e),{AuthType:u,createClient:h})),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let s=yield this.getClient();const n=s.exists(i.dirname(this.dir+"/"+r)),a=new Promise(((e,t)=>{setTimeout((()=>t(new Error("WebDAV exists check timeout"))),5e3)}));!1===(yield Promise.race([n,a]))&&(yield this.ensureDirectoryExists(i.dirname(this.dir+"/"+r)));let d=t.readFileSync(i.join(this.storagePath,o)),l=i.extname(o).substring(1),c=F(l),u=s.createWriteStream(this.dir+"/"+r,{headers:{"content-type":c,"content-length":d.length}});return t.createReadStream(i.join(this.storagePath,o)).pipe(u),new Promise(((t,i)=>{u.on("finish",(()=>{t(!0)})),u.on("error",(i=>b(this,void 0,void 0,(function*(){console.error("Error occurred during file upload:",i);try{let i=s.getFileUploadLink(this.dir+"/"+r);const o=new URL(i);o.search="",i=o.toString();const n=Buffer.from(this.username+":"+this.password,"binary").toString("base64");yield e.put(i,d,{headers:{Authorization:"Basic "+n,"Content-Type":c,"Content-Length":d.length},maxContentLength:1/0,maxBodyLength:1/0});t(!0)}catch(e){console.error("Error occurred during file upload:",e),t(!1)}}))))}))}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){if(this.taskQueue.setDownloadedSize(0),-1===e.indexOf("."))return new ArrayBuffer(0);try{let r=yield this.getClient();if(!1===(yield r.exists(this.dir+"/"+e)))return!0;let s=0,n=t.createWriteStream(i.join(this.storagePath,o)),a=r.createReadStream(this.dir+"/"+e);return a.on("data",(e=>{s+=e.length,this.taskQueue.setDownloadedSize(s)})),a.pipe(n),new Promise(((e,t)=>{n.on("finish",(()=>{e(!0)})),n.on("error",(t=>{e(!1)}))}))}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class X{constructor(e){this.folderExistsCache=new Set,this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){var i,o;return b(this,void 0,void 0,(function*(){try{const r=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);let s=[],n=0;const a=1e3;let d=!0;for(;d;){const l=yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${r}`,"Content-Type":"application/json"},params:{path:t?`/${t}`:"/",limit:a,offset:n,fields:"_embedded.items.name,_embedded.items.size,_embedded.items.type,_embedded.items.modified,_embedded.total"}}),c=(null===(i=l.data._embedded)||void 0===i?void 0:i.items)||[];s=s.concat(c);const u=(null===(o=l.data._embedded)||void 0===o?void 0:o.total)||0;n+=c.length,d=n({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);const o=yield e.delete("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:t?`/${t}`:"/",permanently:!1}});return 202===o.status||204===o.status}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(t){var i,o;return b(this,void 0,void 0,(function*(){try{const r=this.config.access_token,s=t.split("/").filter((e=>e.length>0));let n="";for(const t of s)if(n+="/"+t,!this.folderExistsCache.has(n))try{yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${r}`,"Content-Type":"application/json"},params:{path:n}}),this.folderExistsCache.add(n)}catch(t){if(404!==(null===(i=t.response)||void 0===i?void 0:i.status))return console.error("Error checking directory:",t),!1;try{yield e.put(`https://cloud-api.yandex.net/v1/disk/resources?path=${encodeURIComponent(n)}`,null,{headers:{Authorization:`OAuth ${r}`}}),this.folderExistsCache.add(n)}catch(e){if(409!==(null===(o=e.response)||void 0===o?void 0:o.status))return console.error("Error creating directory:",e),!1;this.folderExistsCache.add(n)}}return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}getAuthUrl(e){return`https://oauth.yandex.com/authorize?response_type=code&client_id=${R}&redirect_uri=${e}&force_confirm=true`}}const Y=o(r.pipeline);class G extends X{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token;let n=this.baseFolder+"/"+r;for(;n.startsWith("/");)n=n.substring(1);const a=n.substring(0,n.lastIndexOf("/"));if(a){if(!(yield this.ensureDirectoryExists(a)))return console.error("Failed to create directory:",a),!1}const d=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/upload",{headers:{Authorization:`OAuth ${s}`,"Content-Type":"application/json"},params:{path:`/${n}`,overwrite:!0}});if(200!==d.status)return console.error("Error getting upload URL:",d),!1;const l=d.data.href,c=t.createReadStream(i.join(this.storagePath,o));return yield e.put(l,c,{headers:{"Content-Type":"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0}),!0}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let s=this.baseFolder+"/"+o;for(;s.startsWith("/");)s=s.substring(1);try{const o=this.config.access_token,n=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/download",{headers:{Authorization:`OAuth ${o}`,"Content-Type":"application/json"},params:{path:`/${s}`}});if(200!==n.status)return console.error("Error getting download URL:",n),!1;const a=n.data.href,d=t.createWriteStream(i.join(this.storagePath,r)),l=yield e({url:a,method:"GET",responseType:"stream",maxContentLength:1/0,maxBodyLength:1/0});let c=0;return l.data.on("data",(e=>{c+=e.length,this.taskQueue.setDownloadedSize(c)})),yield Y(l.data,d),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class Z{constructor(e){this.config=e,this.storagePath=e.storagePath,this.taskQueue=new E(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getClient(){return b(this,void 0,void 0,(function*(){try{if(this.client)return this.client;let{url:e,username:t,password:i,dir:o,port:r}=this.config;const s=new p,n=s.connect({host:e||"",port:r||22,username:t||"",password:i||""}),a=new Promise(((e,t)=>{setTimeout((()=>t(new Error("SFTP connection timeout"))),5e3)}));return yield Promise.race([n,a]),this.client=s,s}catch(e){throw console.error("Error connecting to SFTP server:",e),this.client=null,e}}))}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let{dir:r}=this.config;r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder;let s=yield this.getClient();const n=()=>new Promise(((n,a)=>b(this,void 0,void 0,(function*(){let a=t.createReadStream(i.join(this.storagePath,e)),d="/"+r+"/"+o,l="/"+r+"/"+i.dirname(o);(yield s.exists(l))||(yield s.mkdir(l,!0)),s.put(a,d).then((()=>{n(!0)})).catch((e=>{console.error(e.message),n(!1)}))}))));try{return yield n()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let{dir:r}=this.config;r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder;let s=yield this.getClient();const n=()=>new Promise(((n,a)=>b(this,void 0,void 0,(function*(){let a="/"+r+"/"+e,d=i.join(this.storagePath,o),l=t.createWriteStream(d);s.get(a,l).then((()=>{this.taskQueue.setDownloadedSize(l.bytesWritten||0),n(!0)})).catch((e=>{console.error(e.message),n(!1)}))}))));try{return yield n()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;let i=yield this.getClient();const o=()=>new Promise(((o,r)=>b(this,void 0,void 0,(function*(){let r="/"+t+"/"+e;(yield i.exists(r))||(yield i.mkdir(r,!0),o([])),i.list(r).then((e=>{o(e.map((e=>({name:e.name,size:e.size||0,type:"d"===e.type?"folder":"file",modified:e.modifyTime}))))})).catch((e=>b(this,void 0,void 0,(function*(){console.error(e.message,"list file error"),o([])}))))}))));try{return yield o()}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;let i=yield this.getClient();try{return yield new Promise(((o,r)=>{let s="/"+t+"/"+e;i.delete(s).then((()=>{o(!0)})).catch((e=>{console.error(e.message),o(!1)}))}))}catch(e){return console.error(e),!1}}))}}class ee{downloadFile(e,t){return b(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}uploadFile(e,t){return b(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return new Promise((e=>{e([])}))}))}getAuthUrl(){return""}}class te{constructor(e){this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getFolderIdByPath(t){return b(this,void 0,void 0,(function*(){if(""==t)return"0";const i=this.config.access_token,o=t.split("/");let r="0";for(const t of o){const o=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=folder&limit=1000`;try{const s=(yield e.get(o,{headers:{Authorization:`Bearer ${i}`}})).data.entries.find((e=>e.name===t&&"folder"===e.type));if(s)r=s.id;else{const o={name:t,parent:{id:r},type:"folder"};r=(yield e.post("https://api.box.com/2.0/folders",o,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.id}}catch(e){return console.error("Error occurred during folder creation:",e),""}}return r}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=this.baseFolder+"/"+t;for(;o.startsWith("/");)o=o.substring(1);let r=yield this.getFolderIdByPath(o),s=[],n=0,a=!0;const d=1e3;for(;a;){const t=yield e.get(`https://api.box.com/2.0/folders/${r}/items`,{params:{limit:d,offset:n},headers:{Authorization:`Bearer ${i}`}}),o=t.data.entries||[];s=s.concat(o),n+=o.length,a=o.length===d&&t.data.total_count>n}return[...new Set(s.map((e=>({name:e.name,size:e.size||0,type:e.type,modified:e.content_modified_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=t.substring(0,t.lastIndexOf("/")),r=t.substring(t.lastIndexOf("/")+1);let s=this.baseFolder+"/"+o;for(;s.startsWith("/");)s=s.substring(1);const n=yield this.getFolderIdByPath(s);if(!n)return!0;const a=`https://api.box.com/2.0/folders/${n}/items?fields=id,name&type=file&limit=1000`,d=(yield e.get(a,{headers:{Authorization:`Bearer ${i}`}})).data.entries.find((e=>e.name===r&&"file"===e.type));return!d||(yield e.delete(`https://api.box.com/2.0/files/${d.id}`,{headers:{Authorization:`Bearer ${i}`}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://account.box.com/api/oauth2/authorize?${new URLSearchParams({response_type:"code",client_id:_,redirect_uri:e,grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}).toString()}`}}class ie extends te{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token,n=r.substring(0,r.lastIndexOf("/")),a=r.substring(r.lastIndexOf("/")+1);let d=this.baseFolder+"/"+n;for(;d.startsWith("/");)d=d.substring(1);const l=yield this.getFolderIdByPath(d);if(!l)throw new Error("Folder not found");const c=yield this.listFiles(n);c.find((e=>e===a))&&(yield this.deleteFileWithoutQueue(n+"/"+a));const u=new f,h=JSON.stringify({name:a,parent:{id:l}});u.append("attributes",h),u.append("file",t.createReadStream(i.join(this.storagePath,o)));const p=yield e.post("https://upload.box.com/api/2.0/files/content",u,{headers:Object.assign({Authorization:`Bearer ${s}`},u.getHeaders()),maxContentLength:1/0,maxBodyLength:1/0});return!(p.status>=300)||(console.error("Error occurred during file upload:",p),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token,n=o.substring(0,o.lastIndexOf("/")),a=o.substring(o.lastIndexOf("/")+1);let d=this.baseFolder+"/"+n;for(;d.startsWith("/");)d=d.substring(1);const l=yield this.getFolderIdByPath(d);if(!l)return console.error("Folder not found"),!0;const c=`https://api.box.com/2.0/folders/${l}/items?fields=id,name&type=file&limit=1000`,u=(yield e.get(c,{headers:{Authorization:`Bearer ${s}`}})).data.entries.find((e=>e.name===a&&"file"===e.type));if(!u)return console.error("File not found:",a),!0;const h=yield e({url:`https://api.box.com/2.0/files/${u.id}/content`,method:"get",responseType:"stream",headers:{Authorization:`Bearer ${s}`}});return yield new Promise(((e,o)=>{let s=0;const n=t.createWriteStream(i.join(this.storagePath,r));h.data.on("data",(e=>{s+=e.length,this.taskQueue.setDownloadedSize(s)})),h.data.pipe(n),n.on("finish",e),n.on("error",o)})),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class oe{constructor(e){this.folderCreationLocks=new Map,this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=2){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getStorage(){return b(this,void 0,void 0,(function*(){if(this.storage)return this.storage;let{email:e,password:t}=this.config;return this.storage=yield new g({email:e,password:t,userAgent:"KoodoReader/1.0"}).ready,this.storage}))}getRoot(){return b(this,void 0,void 0,(function*(){if(this.root)return this.root;const e=(yield this.getStorage()).root;if(""===this.baseFolder)return this.root=e,this.root;let t=e.children.find((e=>e.name===this.baseFolder&&e.directory));return t||(t=yield e.mkdir(this.baseFolder)),this.root=t,this.root}))}createFolder(e,t){return b(this,void 0,void 0,(function*(){const i=`${e.nodeId}_${t}`;if(this.folderCreationLocks.has(i))return yield this.folderCreationLocks.get(i);const o=(()=>b(this,void 0,void 0,(function*(){try{let i=e.children.find((e=>e.name===t&&e.directory));return i||(i=yield e.mkdir(t),i)}finally{this.folderCreationLocks.delete(i)}})))();return this.folderCreationLocks.set(i,o),yield o}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){try{let t=yield this.getRoot();if(e){const i=e.split("/").filter((e=>e));for(const e of i){const i=t.children.find((t=>t.name===e&&t.directory));if(!i)return[];t=i}}return t.children.map((e=>({name:e.name,size:e.size||0,type:e.directory?"folder":"file",modified:e.timestamp?new Date(1e3*e.timestamp).toISOString():""})))}catch(e){return console.error("Error listing MEGA files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return b(this,void 0,void 0,(function*(){try{let t=yield this.getRoot();const i=e.split("/"),o=i.pop();for(const e of i){if(!e)continue;const i=t.children.find((t=>t.name===e&&t.directory));if(!i)return!0;t=i}const r=t.children.find((e=>e.name===o&&!e.directory));return!r||(yield r.delete(),!0)}catch(e){return console.error("Error deleting MEGA file:",e),!1}}))}}class re extends oe{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let r=yield this.getRoot();const s=o.split("/"),n=s.pop()||"";for(const e of s){if(!e)continue;let t=r.children.find((t=>t.name===e&&t.directory));t||(t=yield this.createFolder(r,e)),r=t}const a=r.children.find((e=>e.name===n&&!e.directory));a&&(yield a.delete());const d=t.createReadStream(i.join(this.storagePath,e)),l=t.statSync(i.join(this.storagePath,e)).size;return yield r.upload({name:n,size:l},d).complete,!0}catch(e){return console.error("Error occurred during MEGA file upload:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let r=yield this.getRoot();const s=e.split("/"),n=s.pop()||"";for(const e of s){if(!e)continue;const t=r.children.find((t=>t.name===e&&t.directory));if(!t)return!0;r=t}const a=r.children.find((e=>e.name===n&&!e.directory));if(!a)return!0;const d=t.createWriteStream(i.join(this.storagePath,o));let l=0;return new Promise((e=>{const t=a.download();t.on("data",(e=>{l+=e.length,this.taskQueue.setDownloadedSize(l)})),t.pipe(d),d.on("finish",(()=>e(!0))),d.on("error",(t=>{console.error("Error writing file:",t),e(!1)}))}))}catch(e){return console.error("Error occurred during MEGA file download:",e),!1}}))))))}))}}class se{constructor(e){this.config=e,this.driveId="",this.taskQueue=new E(1),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getDriveId(){return b(this,void 0,void 0,(function*(){if(this.driveId)return this.driveId;const t=this.config.access_token,i=yield e.post("https://openapi.alipan.com/adrive/v1.0/user/getDriveInfo",{},{headers:{Authorization:`Bearer ${t}`}});return this.driveId=i.data.default_drive_id,this.driveId}))}getFolderIdByPath(t){return b(this,void 0,void 0,(function*(){const i=this.config.access_token,o=yield this.getDriveId();try{try{const r=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:t},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});if(r.data)return r.data.file_id}catch(r){const s=t.split("/").filter((e=>e));let n="",a="root";for(const t of s){n+="/"+t;try{a=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:n},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.file_id}catch(r){a=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:o,parent_file_id:a,name:t,type:"folder",check_name_mode:"refuse"},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.file_id}}return a}}catch(e){return console.error("Error getting/creating folder by path:",e),""}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=yield this.getDriveId(),r=yield this.getFolderIdByPath(this.baseFolder+"/"+t);let s=[],n="",a=!0;for(;a;){const t=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/list",{drive_id:o,parent_file_id:r,marker:n||void 0},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}}),d=t.data.items.filter((e=>!e.punish_flag||2!==e.punish_flag))||[];s=s.concat(d),n=t.data.next_marker,a=!!n}return[...new Set(s.map((e=>({name:e.name,size:e.size,type:e.type,modified:e.updated_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=yield this.getDriveId(),r=yield this.getFolderIdByPath(this.baseFolder+"/"+t);return!r||(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/delete",{drive_id:o,file_id:r},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}checkExists(t){var i;return b(this,void 0,void 0,(function*(){try{const o=this.config.access_token,r=yield this.getDriveId(),s=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:r,file_path:t},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}});(null===(i=s.data)||void 0===i?void 0:i.file_id)&&(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/recyclebin/trash",{drive_id:r,file_id:s.data.file_id},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}))}catch(e){}}))}getAuthUrl(e){return`https://openapi.alipan.com/oauth/authorize?${new URLSearchParams({response_type:"code",client_id:L,redirect_uri:e,grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}).toString()}`}}class ne extends se{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token,n=yield this.getDriveId(),a=r.substring(0,r.lastIndexOf("/")),d=r.substring(r.lastIndexOf("/")+1);yield this.deleteFileWithoutQueue(r);const l=yield this.getFolderIdByPath(this.baseFolder+"/"+a),c=i.join(this.storagePath,o),u=yield t.promises.readFile(c),h=u.length,p=y.createHash("sha1").update(u).digest("hex"),f=y.createHash("md5").update(s).digest("hex"),g=Number(BigInt("0x"+f.slice(0,16))%BigInt(h||1)),m=u.slice(g,Math.min(g+8,h)).toString("base64"),v=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:n,parent_file_id:l,name:d,type:"file",check_name_mode:"ignore",size:h,content_hash:p,content_hash_name:"sha1",proof_code:m,proof_version:"v1",part_info_list:[{part_number:1}]},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}),{file_id:k,upload_id:b,rapid_upload:F,part_info_list:w}=v.data;return F?(console.info("阿里云盘秒传成功"),!0):(yield fetch(w[0].upload_url,{method:"PUT",body:u,headers:{"Content-Length":h.toString()}}),yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/complete",{drive_id:n,file_id:k,upload_id:b},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token,n=yield this.getDriveId(),a=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:n,file_path:this.baseFolder+"/"+o},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}})).data.file_id,d=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/getDownloadUrl",{drive_id:n,file_id:a},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}),l=yield e({url:d.data.url,method:"get",responseType:"stream"});let c=0;const u=t.createWriteStream(i.join(this.storagePath,r+".temp"));return l.data.on("data",(e=>{c+=e.length,this.taskQueue.setDownloadedSize(c)})),l.data.pipe(u),new Promise((e=>{u.on("finish",(()=>{t.renameSync(i.join(this.storagePath,r+".temp"),i.join(this.storagePath,r)),e(!0)})),u.on("error",(t=>{console.error("Error occurred during file download:",t),e(!1)}))}))}catch(e){return console.error("Error downloading file:",e),!1}}))))))}))}}class ae{constructor(e){this.baseUrl="https://api.pcloud.com",this.config=e,this.taskQueue=new E(3),this.baseUrl="2"===e.region?"https://eapi.pcloud.com":"https://api.pcloud.com"}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}checkFolderExists(t,i){return b(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:i,path:`/${t}`}})).data.result}catch(e){return console.error("Error checking folder:",e),!1}}))}createFolder(t,i){return b(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/createfolderifnotexists`,{params:{access_token:i,path:`/${t}`}})).data.result}catch(e){return console.error("Error creating folder:",e),!1}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:i,path:"/"+t,recursive:0}});return 0!==o.data.result?[]:o.data.metadata.contents.map((e=>({name:e.name,size:e.size||0,type:e.isfolder?"folder":"file",modified:e.modified})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/deletefile`,{params:{access_token:i,path:"/"+t}});return 0===o.data.result||(console.error("Error deleting file:",o.data),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://my.pcloud.com/oauth2/authorize?client_id=${C}&response_type=code&redirect_uri=${e}`}}class de extends ae{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.refresh_token,n=r.split("/").slice(0,-1).join("/");if(!(yield this.checkFolderExists(n,s))){if(!(yield this.createFolder(n,s)))return!1}const a=i.join(this.storagePath,o),d=t.createReadStream(a),l=t.statSync(a),c=i.basename(o),u=yield e({method:"put",url:`${this.baseUrl}/uploadfile`,params:{access_token:s,path:`/${n}`,renew:1,filename:c},data:d,headers:{"Content-Length":l.size,"Content-Type":"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0});return 0===u.data.result||(console.error("Error uploading file:",u.data),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.refresh_token,n=yield e.get(`${this.baseUrl}/getfilelink`,{params:{access_token:s,path:`/${o}`}});if(0!==n.data.result)return console.error("Error getting file link:",n.data),!1;const a=i.join(this.storagePath,r),d=t.createWriteStream(a),l=`https://${n.data.hosts[0]}${n.data.path}`,c=yield e({method:"get",url:l,responseType:"stream",maxContentLength:1/0,maxBodyLength:1/0});return new Promise((e=>{let t=0;c.data.on("data",(e=>{t+=e.length,this.taskQueue.setDownloadedSize(t)})),c.data.pipe(d),d.on("finish",(()=>{e(!0)})),d.on("error",(t=>{console.error("Error writing file:",t),e(!1)}))}))}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class le{constructor(e){this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=this.baseFolder;t&&""!==t.trim()&&(o=o+"/"+t),o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));let r=[],s=0;const n=1e3;for(;;){const t=yield e.get("https://pan.baidu.com/rest/2.0/xpan/file",{params:{method:"list",access_token:i,dir:"/"+o,start:s,limit:n,order:"name",desc:0,web:1,folder:0},headers:{"User-Agent":"pan.baidu.com"}});if(t.status>=300||0!==t.data.errno){console.error("百度网盘API错误:",t.data);break}const a=t.data.list||[];if(0===a.length)break;if(r=r.concat(a),a.length({name:e.server_filename,size:e.size||0,type:e.isdir?"folder":"file",modified:new Date(1e3*e.server_mtime).toISOString(),path:e.path,fs_id:e.fs_id})))}catch(e){return console.error("获取百度网盘文件列表时发生错误:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=this.baseFolder+"/"+t;o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));const r=new URLSearchParams({async:"0",filelist:JSON.stringify(["/"+o])}),s=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=filemanager&access_token=${i}&opera=delete`,r.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==s.data.errno)return console.error("百度网盘删除文件API错误:",s.data),-9===s.data.errno?console.error("文件不存在"):111===s.data.errno?console.error("有其他异步任务正在执行"):-7===s.data.errno&&console.error("文件名非法"),!1;const n=s.data.info||[];for(const e of n)if(0!==e.errno)return console.error(`文件删除失败: ${e.path}, 错误码: ${e.errno}`),!1;return!0}catch(e){return console.error("删除文件时发生错误:",e),!1}}))}getAuthUrl(e){return`https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=${P}&redirect_uri=${e}&scope=basic,netdisk&device_id=119827642&display=page&qrcode=1`}}const ce=4194304;class ue extends le{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){var s;let n=null;try{const s=this.config.access_token;let a=this.baseFolder+"/"+r;a=a.replace(/\/+/g,"/"),a.startsWith("/")&&(a=a.substring(1));const d=i.join(this.storagePath,o),l=yield this.getFileSize(d),{contentMd5:c,sliceMd5:u,blockList:h}=yield this.calculateFileMd5(d,l),p=new URLSearchParams({path:"/"+a,size:l.toString(),isdir:"0",autoinit:"1",rtype:"3",block_list:JSON.stringify(h),"content-md5":c,"slice-md5":u,local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),g=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=${s}`,p.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==g.data.errno)return console.error("预上传失败:",g.data),-7===g.data.errno?console.error("文件或目录名错误或无权访问"):-10===g.data.errno&&console.error("容量不足"),!1;const y=g.data.uploadid,m=g.data.block_list||[];if(0===m.length)return!0;const v=yield this.getUploadDomain(s,"/"+a,y);if(!v)return console.error("获取上传域名失败"),!1;n=yield t.promises.open(d,"r");for(const t of m){const i=t*ce,o=Math.min(ce,l-i),r=Buffer.alloc(o),{bytesRead:d}=yield n.read(r,0,o,i);if(0===d)break;const c=r.slice(0,d),u=h[t],p=new f;p.append("file",c,{filename:`chunk_${t}`,contentType:"application/octet-stream",knownLength:c.length});const g=`${v}/rest/2.0/pcs/superfile2?method=upload&access_token=${s}&type=tmpfile&path=${encodeURIComponent("/"+a)}&uploadid=${y}&partseq=${t}`,m=yield e.post(g,p,{headers:Object.assign(Object.assign({"User-Agent":"pan.baidu.com"},p.getHeaders()),{"Content-Length":p.getLengthSync().toString()}),maxContentLength:1/0,maxBodyLength:1/0,timeout:0});if(m.status>=300)throw 31024===m.data.errno?console.error("没有申请上传权限"):31299===m.data.errno?console.error("第一个分片的大小小于4MB"):31364===m.data.errno?console.error("超出分片大小限制"):31363===m.data.errno&&console.error("分片缺失"),new Error(`分片上传失败: ${JSON.stringify(m.data)}`);const k=m.data.md5;k&&k!==u&&console.warn(`分片 ${t} MD5不匹配: 期望 ${u}, 实际 ${k}`)}const k=new URLSearchParams({path:"/"+a,size:l.toString(),isdir:"0",block_list:JSON.stringify(h),uploadid:y,rtype:"3",local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),b=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${s}`,k.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});return 0===b.data.errno||(console.error("创建文件失败:",b.data),-7===b.data.errno?console.error("文件或目录名错误或无权访问"):-8===b.data.errno?console.error("文件或目录已存在"):-10===b.data.errno?console.error("云端容量已满"):10===b.data.errno?console.error("创建文件失败,一般是分片问题"):31190===b.data.errno?console.error("文件不存在,一般是分片上传阶段有问题"):31355===b.data.errno?console.error("参数异常,一般是uploadid参数传的有问题"):31365===b.data.errno&&console.error("文件总大小超限"),!1)}catch(e){return console.error("文件上传过程中发生错误:",(null===(s=e.response)||void 0===s?void 0:s.data)||e.message||e),!1}finally{n&&(yield n.close())}}))))))}))}getUploadDomain(t,i,o){return b(this,void 0,void 0,(function*(){try{const r=yield e.get("https://d.pcs.baidu.com/rest/2.0/pcs/file",{params:{method:"locateupload",appid:"250528",access_token:t,path:i,uploadid:o,upload_version:"2.0"},headers:{"User-Agent":"pan.baidu.com"}});if(0!==r.data.error_code)return console.error("获取上传域名失败:",r.data),null;const s=r.data.servers||[],n=s.find((e=>e.server.startsWith("https://")));return n?n.server:s.length>0?s[0].server:(console.error("没有可用的上传服务器"),null)}catch(e){return console.error("获取上传域名时出错:",e),null}}))}calculateFileMd5(e,i){return b(this,void 0,void 0,(function*(){const o=yield t.promises.open(e,"r");try{const e=y.createHash("md5"),t=[];let r="",s=0;for(;sthis.retryOperation((()=>b(this,void 0,void 0,(function*(){var s;this.taskQueue.setDownloadedSize(0);try{const n=this.config.access_token;let a,d=this.baseFolder+"/"+o;d=d.replace(/\/+/g,"/"),d.startsWith("/")&&(d=d.substring(1));let l=yield this.listFileInfos(o.substring(0,o.lastIndexOf("/")));const c=d.split("/").pop(),u=l.find((e=>e.name===c));if(!u)return console.error("文件不存在:",o),!1;const h=yield e.get("https://pan.baidu.com/rest/2.0/xpan/multimedia",{params:{method:"filemetas",access_token:n,fsids:JSON.stringify([u.fs_id]),dlink:1},headers:{"User-Agent":"pan.baidu.com"}});if(0!==h.data.errno||!(null===(s=h.data.list)||void 0===s?void 0:s[0]))return console.error("获取下载链接失败:",h.data),!1;a=h.data.list[0];const p=a.dlink,f=yield e.get(p,{responseType:"stream",params:{access_token:n},headers:{"User-Agent":"pan.baidu.com"}});let g=0;const y=t.createWriteStream(i.join(this.storagePath,r));f.data.on("data",(e=>{g+=e.length,this.taskQueue.setDownloadedSize(g)})),yield new Promise(((e,t)=>{f.data.pipe(y),y.on("finish",(()=>{e()})),y.on("error",t)}));return(yield this.getFileSize(i.join(this.storagePath,r)))===a.size||(console.error("Downloaded file size does not match expected size."),yield t.promises.unlink(i.join(this.storagePath,r)),!1)}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}class he{constructor(e){this.username=e.username,this.password=e.password,this.url=e.url,this.taskQueue=new E(3)}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{return(yield e.get(`${this.url}/list`,{params:{dir:t},auth:{username:this.username,password:this.password}})).data.files.map((e=>({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modifiedTime})))||[]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{return(yield e.delete(`${this.url}/delete`,{params:{dir:t.split("/").slice(0,-1).join("/")||"",filename:t.split("/").pop()},auth:{username:this.username,password:this.password}})).data.success}catch(e){return console.error("Error deleting file:",e),!1}}))}}const pe=o(r.pipeline);class fe extends he{constructor(e){super(e),this.storagePath=e.storagePath}getAuthHeader(){return`Basic ${btoa(`${this.username}:${this.password}`)}`}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{r.split("/").pop();const s=r.substring(0,r.lastIndexOf("/"))||"";let n=this.listFiles("");const a=new Promise(((e,t)=>{setTimeout((()=>t(new Error("Docker connection timeout"))),5e3)}));yield Promise.race([n,a]);const d=t.createReadStream(i.join(this.storagePath,o)),l=new f;l.append("file",d);const c=yield e.post(`${this.url}/upload?dir=${encodeURIComponent(s)}`,l,{headers:Object.assign(Object.assign({},l.getHeaders()),{Authorization:this.getAuthHeader()}),maxContentLength:1/0,maxBodyLength:1/0});return!(c.status>=300)||(console.error("Error occurred during file upload:",c),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=o.split("/").pop()||"",n=o.substring(0,o.lastIndexOf("/"))||"",a=t.createWriteStream(i.join(this.storagePath,r)),d=yield e({url:`${this.url}/download`,method:"GET",params:{dir:n,filename:s},headers:{Authorization:this.getAuthHeader()},maxContentLength:1/0,maxBodyLength:1/0,responseType:"stream"});if(d.status>=300)return console.error("Error occurred during file download:",d),a.destroy(),t.existsSync(i.join(this.storagePath,r))&&t.unlinkSync(i.join(this.storagePath,r)),!1;let l=0;return d.data.on("data",(e=>{l+=e.length,this.taskQueue.setDownloadedSize(l)})),yield pe(d.data,a),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ge{constructor(e){this.baseUrl="https://proapi.115.com",this.config=e,this.taskQueue=new E(1),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getUploadCredentials(t){return b(this,void 0,void 0,(function*(){try{const i=yield e.get(`${this.baseUrl}/open/upload/get_token`,{headers:{Authorization:`Bearer ${t}`}});return i.status>=300||!i.data.state?(console.error("Error getting upload credentials:",i.data),null):i.data.data}catch(e){return console.error("Error occurred during get upload credentials:",e),null}}))}generateOSSPolicy(e,t,i=new Date(Date.now()+36e5)){const o={expiration:i.toISOString(),conditions:[{bucket:e},{key:t},["starts-with","$success_action_status","2"],["content-length-range",0,1073741824]]};return JSON.stringify(o)}getAuthUrl(e){return`https://passportapi.115.com/open/authorize?client_id=${A}&response_type=code&redirect_uri=${e}`}}class ye extends ge{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(e,t){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){var o;try{const o=this.config.access_token;let r=this.baseFolder+"/"+t;r.startsWith("/")||(r="/"+r);let s=i.dirname(r),n=yield this.getFolderInfo(s,!0),a="0";if(n)a=n.file_id;else{let e=yield this.createFolder(s);if(!e)return console.error("Failed to create folder:",s),!1;a=e}const d=i.join(this.storagePath,e),l=yield this.getFileSize(d),c=yield this.calculateFileSha1(d),u=yield this.calculatePreSha1(d),h=i.basename(t);yield this.deleteFileWithoutQueue(t);let p=yield this.initializeUpload(a,h,l,c,u,o);if(!p)return console.error("Failed to initialize upload"),!1;if((6===p.status||7===p.status||8===p.status)&&(p=yield this.handleSecondAuth(a,p,d,h,l,c,u,o),!p))return console.error("Second authentication failed"),!1;if(2===p.status)return console.info(`File ${e} uploaded successfully via instant upload.`),!0;const f=yield this.getUploadCredentials(o);if(!f)return console.error("Failed to get upload credentials"),!1;return(yield this.uploadToObjectStorage(d,p,f))?(console.info(`File ${e} uploaded successfully.`),!0):(console.error("Failed to upload to object storage"),!1)}catch(e){return console.error("Error occurred during file upload:",(null===(o=e.response)||void 0===o?void 0:o.data)||e.message||e),!1}}))))))}))}calculateFileSha1(e){return b(this,void 0,void 0,(function*(){return new Promise(((i,o)=>{const r=y.createHash("sha1"),s=t.createReadStream(e);s.on("data",(e=>{r.update(e)})),s.on("end",(()=>{i(r.digest("hex"))})),s.on("error",(e=>{o(e)}))}))}))}calculatePreSha1(e){return b(this,void 0,void 0,(function*(){return new Promise(((i,o)=>{const r=y.createHash("sha1"),s=t.createReadStream(e,{start:0,end:131071});s.on("data",(e=>{r.update(e)})),s.on("end",(()=>{i(r.digest("hex"))})),s.on("error",(e=>{o(e)}))}))}))}handleSecondAuth(e,i,o,r,s,n,a,d){return b(this,void 0,void 0,(function*(){try{if(!i.sign_check)return console.error("No sign_check provided for second authentication"),null;const[l,c]=i.sign_check.split("-"),u=parseInt(l),h=parseInt(c),p=Buffer.alloc(h-u+1),f=yield t.promises.open(o,"r");try{yield f.read(p,0,p.length,u);const t=y.createHash("sha1");t.update(p);const o=t.digest("hex").toUpperCase();return yield this.initializeUpload(e,r,s,n,a,d,i.sign_key,o,i.pick_code)}finally{yield f.close()}}catch(e){return console.error("Error during second authentication:",e),null}}))}calculateOSSSignature(e,t){const i=Buffer.from(t).toString("base64");return y.createHmac("sha1",e).update(i).digest("base64")}uploadToObjectStorage(o,r,s){var n;return b(this,void 0,void 0,(function*(){try{const n=s.endpoint,a=r.bucket,d=r.object;let l;if(n.includes(a))l=n;else{l=`https://${a}.${n.replace(/^https?:\/\//,"")}`}const c=this.generateOSSPolicy(a,d),u=this.calculateOSSSignature(s.AccessKeySecret,c),h=Buffer.from(c).toString("base64"),p=new f;if(p.append("key",d),p.append("policy",h),p.append("OSSAccessKeyId",s.AccessKeyId),p.append("signature",u),p.append("x-oss-security-token",s.SecurityToken),p.append("success_action_status","200"),r.callback&&r.callback.callback){const e=Buffer.from(r.callback.callback).toString("base64");if(p.append("callback",e),r.callback.callback_var){const e=JSON.parse(r.callback.callback_var);for(const[t,i]of Object.entries(e))p.append(t,String(i))}}const g=t.createReadStream(o);p.append("file",g,i.basename(o));const y=yield e.post(l,p,{headers:Object.assign({},p.getHeaders()),maxContentLength:1/0,maxBodyLength:1/0});return 200===y.status||204===y.status||(console.error("Upload failed with status:",y.status),!1)}catch(e){return console.error("Error uploading file via REST API:",(null===(n=e.response)||void 0===n?void 0:n.data)||e.message||e),!1}}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let s=this.baseFolder+"/"+o;s=s.replace(/\/+/g,"/"),s.startsWith("/")||(s="/"+s);const n=yield this.getFolderInfo(s,!1);if(!n||!n.pick_code)return console.error("Failed to get file info or pick_code for:",o),!1;const a=yield this.getFileDownloadUrl(n.pick_code);if(!a)return console.error("Failed to get download URL for:",o),!1;const d=yield e.get(a.url,{responseType:"stream"});let l=0;const c=t.createWriteStream(i.join(this.storagePath,r));return d.data.on("data",(e=>{l+=e.length,this.taskQueue.setDownloadedSize(l)})),yield new Promise(((e,t)=>{d.data.pipe(c),c.on("finish",(()=>{e()})),c.on("error",t)})),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;(t=this.baseFolder+"/"+t).startsWith("/")||(t="/"+t);let o=[],r=0;const s=1150;let n=!0,a=yield this.getFolderInfo(t,!0),d="";if(a)d=a.file_id;else{let e=yield this.createFolder(t);if(!e)return console.error("Failed to create folder:",t),[];d=e}if(!d)return console.error("Failed to get or create folder ID:",t),[];let l=d;for(;n;){const t={offset:r,limit:s,cur:1,show_dir:1};l&&(t.cid=l);const a=yield e.get(`${this.baseUrl}/open/ufile/files`,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},params:t});if(a.status>=300)break;const d=a.data.data||[];o=o.concat(d),d.length({name:e.fn,size:e.fs||0,type:"0"===e.fc?"folder":"file",modified:new Date(1e3*e.upt).toISOString()})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}getFileDownloadUrl(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=new f;o.append("pick_code",t);const r=yield e.post(`${this.baseUrl}/open/ufile/downurl`,o,{headers:Object.assign({Authorization:`Bearer ${i}`},o.getHeaders())});if(r.status>=300)return console.error("Error getting download URL:",r.data),null;const s=r.data.data,n=Object.keys(s)[0];return n&&s[n]?s[n].url:(console.error("No file data found in download URL response"),null)}catch(e){return console.error("Error occurred during get download URL:",e),null}}))}initializeUpload(t,i,o,r,s,n,a,d,l){return b(this,void 0,void 0,(function*(){try{const c=new f;c.append("file_name",i),c.append("file_size",o.toString()),t?c.append("target","U_1_"+t):c.append("target","U_1_0"),c.append("fileid",r),c.append("preid",s),c.append("topupload","0"),l&&c.append("pick_code",l),a&&c.append("sign_key",a),d&&c.append("sign_val",d);const u=yield e.post(`${this.baseUrl}/open/upload/init`,c,{headers:Object.assign({Authorization:`Bearer ${n}`},c.getHeaders())});return u.status>=300||!u.data.state?(console.error("Error initializing upload:",u.data),null):u.data.data}catch(e){return console.error("Error occurred during upload initialization:",e),null}}))}createFolder(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=t.replace(/^\/+|\/+$/g,"");if(!o)return"";const r=o.split("/");let s="",n="0";for(const t of r){s=s?`${s}/${t}`:t;const o=yield this.getFolderInfo(s,!0);if(o&&o.file_id)n=o.file_id;else{const o=new f;o.append("pid",n),o.append("file_name",t);const r=yield e.post(`${this.baseUrl}/open/folder/add`,o,{headers:Object.assign({Authorization:`Bearer ${i}`},o.getHeaders())});if(r.status>=300||!r.data.state)return console.error("Error creating folder:",r.data),"";n=r.data.data.file_id}}return n}catch(e){return console.error("Error occurred during folder creation:",e),""}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;t=this.baseFolder+"/"+t;let o=yield this.getFolderInfo(t,!1);if(!o)return!0;let r=new f;r.append("file_ids",o.file_id);const s=yield e.post(`${this.baseUrl}/open/ufile/delete`,r,{headers:Object.assign({Authorization:`Bearer ${i}`},r.getHeaders())});return!(s.status>=300||!s.data.state)||(console.error("Error deleting file:",s),!1)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getFolderInfo(t,i){return b(this,void 0,void 0,(function*(){if(""===t||"/"===t)return{file_id:"0"};t.startsWith("/")||(t="/"+t);try{const i=this.config.access_token;let o=new f;o.append("path",t);const r=yield e.post(`${this.baseUrl}/open/folder/get_info`,o,{headers:Object.assign(Object.assign({},o.getHeaders()),{Authorization:`Bearer ${i}`})});return r.status>=300||!r.data.state||0===r.data.data.length?(console.error("Error getting file info:",r.data),null):r.data.data}catch(e){return console.error("Error occurred during get file info:",e),null}}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}const me=()=>{let e="";if("darwin"===process.platform){const o=i.join(m.homedir(),"Library","Mobile Documents","iCloud~com~koodoreader~expo","Documents");t.existsSync(o)&&(e=o)}return e&&t.existsSync(e)&&t.existsSync(e)?e:""};class ve{constructor(e){this.config=e,this.storagePath=e.storagePath,this.taskQueue=new E(5)}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){let s=me();if(!s)return console.error("iCloud Drive path not found"),void r(!1);let n=s+"/"+o,a=s+"/"+i.dirname(o);t.existsSync(a)||t.mkdirSync(a,{recursive:!0}),t.existsSync(n)&&t.unlinkSync(n),t.copyFile(i.join(this.storagePath,e),n,(e=>{e?(console.error("Error uploading file:",e),r(!1)):r(!0)}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){let s=me();if(!s)return console.error("iCloud Drive path not found"),void r(!1);let n=s+"/"+e,a=i.join(this.storagePath,o);if(!t.existsSync(n))return console.error("File does not exist in iCloud:",e),void r(!1);t.existsSync(a)&&t.unlinkSync(a),t.copyFile(n,a,(e=>{if(e)console.error("Error downloading file:",e),r(!1);else{let e=t.statSync(a);this.taskQueue.setDownloadedSize(e.size),r(!0)}}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){const o=()=>new Promise(((o,r)=>b(this,void 0,void 0,(function*(){let r=me();if(!r)return console.error("iCloud Drive path not found"),void o([]);let s=r+"/"+e;t.existsSync(s)||t.mkdirSync(s,{recursive:!0}),t.readdir(s,{withFileTypes:!0},((e,r)=>{if(e)return console.error("Error reading directory:",e),void o([]);let n=r.map((e=>{let o=i.join(s,e.name),r=t.statSync(o);return{name:e.name,size:r.size,type:e.isDirectory()?"folder":"file",modified:r.mtime.toISOString()}}));o(n)}))}))));try{return yield o()}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){try{return yield new Promise(((i,o)=>{let r=me();if(!r)return console.error("iCloud Drive path not found"),void i(!1);let s=r+"/"+e;t.unlink(s,(e=>{e?(console.error("Error deleting file:",e),i(!1)):i(!0)}))}))}catch(e){return console.error(e),!1}}))}}class ke{constructor(e){this.config=e,this.storagePath=e.storagePath,this.drivePath=e.drivePath,this.taskQueue=new E(5)}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void r(!1);let s=this.drivePath+"/"+o,n=this.drivePath+"/"+i.dirname(o);t.existsSync(n)||t.mkdirSync(n,{recursive:!0}),t.existsSync(s)&&t.unlinkSync(s),t.copyFile(i.join(this.storagePath,e),s,(e=>{e?(console.error("Error uploading file:",e),r(!1)):r(!0)}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void r(!1);let s=this.drivePath+"/"+e,n=i.join(this.storagePath,o);if(!t.existsSync(s))return console.error("File does not exist in path:",e),void r(!1);t.existsSync(n)&&t.unlinkSync(n),t.copyFile(s,n,(e=>{if(e)console.error("Error downloading file:",e),r(!1);else{let e=t.statSync(n);this.taskQueue.setDownloadedSize(e.size),r(!0)}}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){const o=()=>new Promise(((o,r)=>b(this,void 0,void 0,(function*(){if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void o([]);let r=this.drivePath+"/"+e;t.existsSync(r)||t.mkdirSync(r,{recursive:!0}),t.readdir(r,{withFileTypes:!0},((e,s)=>{if(e)return console.error("Error reading directory:",e),void o([]);let n=s.map((e=>{let o=i.join(r,e.name),s=t.statSync(o);return{name:e.name,size:s.size,type:e.isDirectory()?"folder":"file",modified:s.mtime.toISOString()}}));o(n)}))}))));try{return yield o()}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){const i=()=>new Promise(((i,o)=>{if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void i(!1);let r=this.drivePath+"/"+e;t.unlink(r,(e=>{e?(console.error("Error deleting file:",e),i(!1)):i(!0)}))}));try{return yield i()}catch(e){return console.error(e),!1}}))}}const be=["book","config","cover","font"];class Fe{constructor(e,t){this.type=e,this.storagePath=t.storagePath,this.remote="dropbox"===e?new D(t):"microsoft"===e?new W(t):"google"===e?new K(t):"microsoft_exp"===e?new W(Object.assign(Object.assign({},t),{isExp:!0})):"google_exp"===e?new K(Object.assign(Object.assign({},t),{isExp:!0})):"s3compatible"===e?new q(t):"webdav"===e?new V(t):"docker"===e?new fe(t):"ftp"===e?new B(t):"sftp"===e?new Z(t):"boxnet"===e?new ie(t):"mega"===e?new re(t):"adrive"===e?new ne(t):"pcloud"===e?new de(t):"dubox"===e?new ue(t):"yandex"===e?new G(t):"yiyiwu"===e?new ye(t):"icloud"===e?new ve(t):"folder"===e?new ke(t):new ee}downloadFile(e,o,r){return b(this,void 0,void 0,(function*(){if(t.existsSync(i.join(this.storagePath+"/"+r))||t.mkdirSync(i.join(this.storagePath+"/"+r)),"cover"!==r){if(!(yield this.listFiles(r)).find((t=>e.indexOf(t)>-1)))return!1}return yield this.remote.downloadFile(r+"/"+e,r+"/"+o)}))}uploadFile(e,o,r){return b(this,void 0,void 0,(function*(){const s=i.join(this.storagePath,r,e);return!(!t.existsSync(s)||0!==t.statSync(s).size)||(yield this.remote.uploadFile(r+"/"+e,r+"/"+o))}))}deleteFile(e,t){return b(this,void 0,void 0,(function*(){return!!(yield this.listFiles(t)).find((t=>e.indexOf(t)>-1))&&(yield this.remote.deleteFile(t+"/"+e))}))}isExist(e,t){return b(this,void 0,void 0,(function*(){return(yield this.listFiles(t)).find((t=>-1!==t.indexOf(e)))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return yield this.remote.listFiles(e)}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){return yield this.remote.listFileInfos(e)}))}downloadAllFiles(){return b(this,void 0,void 0,(function*(){for(let e of be){let t=yield this.listFiles(e);for(let i of t)yield this.downloadFile(i,i,e)}}))}getAuthUrl(e){return this.remote.getAuthUrl(e)}getStats(){return this.remote.taskQueue.getStats()}clearQueue(){return this.remote.taskQueue.clearQueue()}resetCounters(){this.remote.taskQueue.resetCounters()}getDownloadedSize(){return this.remote.taskQueue.getDownloadedSize()}}const we={words:['ALTER TABLE words ADD COLUMN "sentence" text']},Ee={notes:"SELECT * FROM notes WHERE key = ?",bookmarks:"SELECT * FROM bookmarks WHERE key = ?",books:"SELECT * FROM books WHERE key = ?",plugins:"SELECT * FROM plugins WHERE key = ?",words:"SELECT * FROM words WHERE key = ?"},Se={notes:"SELECT * FROM notes WHERE bookKey = ?",bookmarks:"SELECT * FROM bookmarks WHERE bookKey = ?",words:"SELECT * FROM words WHERE bookKey = ?",books:"SELECT * FROM books WHERE key = ?"},Te={notes:"DELETE FROM notes WHERE bookKey = ?",bookmarks:"DELETE FROM bookmarks WHERE bookKey = ?",words:"DELETE FROM words WHERE bookKey = ?"};function Oe(e){for(const t in e)e.hasOwnProperty(t)&&(e[`temp-${t}`]=e[t]);return e}const xe={notes:e=>{let t=Object.assign({},e);return t.date=JSON.parse(e.date),t.tag=JSON.parse(e.tag),t},bookmarks:e=>e,books:e=>e,plugins:e=>{let t=Object.assign({},e);return e.autoValue||delete t.autoValue,e.langList?t.langList=JSON.parse(e.langList):delete t.langList,e.voiceList?t.voiceList=JSON.parse(e.voiceList):delete t.voiceList,t.config=JSON.parse(e.config),t},words:e=>{let t=Object.assign({},e);return t.date=JSON.parse(e.date),void 0===t.sentence&&(t.sentence=""),t}};var Re={sqlStatement:{createTableStatement:Oe({notes:'\n CREATE TABLE IF NOT EXISTS "notes" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "chapter" text,\n "chapterIndex" integer,\n "text" text,\n "cfi" text,\n "range" text,\n "notes" text,\n "percentage" text,\n "color" integer,\n "tag" array\n )\n ',bookmarks:'\n CREATE TABLE IF NOT EXISTS "bookmarks" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "cfi" text,\n "label" text,\n "percentage" text,\n "chapter" text\n );\n ',books:'\n CREATE TABLE IF NOT EXISTS "books" (\n "key" text PRIMARY KEY,\n "name" text,\n "author" text,\n "description" text,\n "md5" text,\n "cover" text,\n "format" text,\n "publisher" text,\n "size" integer,\n "page" integer,\n "path" text,\n "charset" text\n );\n ',plugins:'\n CREATE TABLE IF NOT EXISTS "plugins" (\n "key" text PRIMARY KEY,\n "type" text,\n "displayName" text,\n "icon" text,\n "version" text,\n "config" object,\n "autoValue" string,\n "langList" text,\n "voiceList" text,\n "scriptSHA256" text,\n "script" text\n );\n ',words:'\n CREATE TABLE IF NOT EXISTS "words" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "word" text,\n "sentence" text,\n "chapter" text\n );\n '}),migrateStatement:Oe(we),getAllStatement:Oe({notes:"SELECT * FROM notes",bookmarks:"SELECT * FROM bookmarks",books:"SELECT * FROM books",plugins:"SELECT * FROM plugins",words:"SELECT * FROM words"}),getPagedStatement:Oe({notes:"SELECT * FROM notes LIMIT ? OFFSET ?",bookmarks:"SELECT * FROM bookmarks LIMIT ? OFFSET ?",books:"SELECT * FROM books LIMIT ? OFFSET ?",plugins:"SELECT * FROM plugins LIMIT ? OFFSET ?",words:"SELECT * FROM words LIMIT ? OFFSET ?"}),getCountStatement:Oe({notes:"SELECT COUNT(*) as count FROM notes",bookmarks:"SELECT COUNT(*) as count FROM bookmarks",books:"SELECT COUNT(*) as count FROM books",plugins:"SELECT COUNT(*) as count FROM plugins",words:"SELECT COUNT(*) as count FROM words"}),saveStatement:Oe({notes:"INSERT OR REPLACE INTO notes (key, bookKey, chapter, chapterIndex, text, cfi, range, notes, date, percentage, color, tag) VALUES (@key, @bookKey, @chapter, @chapterIndex, @text, @cfi, @range, @notes, @date, @percentage, @color, @tag)",bookmarks:"INSERT OR REPLACE INTO bookmarks (key, bookKey, cfi, label, percentage, chapter) VALUES (@key, @bookKey, @cfi, @label, @percentage, @chapter)",books:"INSERT OR REPLACE INTO books (key, name, author, description, md5, cover, format, publisher, size, page, path, charset) VALUES (@key, @name, @author, @description, @md5, @cover, @format, @publisher, @size, @page, @path, @charset)",plugins:"INSERT OR REPLACE INTO plugins (key, type, displayName, icon, version, config, autoValue, langList, voiceList, scriptSHA256, script) VALUES (@key, @type, @displayName, @icon, @version, @config, @autoValue, @langList, @voiceList, @scriptSHA256, @script)",words:"INSERT OR REPLACE INTO words (key, bookKey, date, word, sentence, chapter) VALUES (@key, @bookKey, @date, @word, @sentence, @chapter)"}),deleteAllStatement:Oe({notes:"DELETE FROM notes",bookmarks:"DELETE FROM bookmarks",books:"DELETE FROM books",plugins:"DELETE FROM plugins",words:"DELETE FROM words"}),updateStatement:Oe({notes:"UPDATE notes SET bookKey = @bookKey, chapter = @chapter, chapterIndex = @chapterIndex, text = @text, cfi = @cfi, range = @range, notes = @notes, date = @date, percentage = @percentage, color = @color, tag = @tag WHERE key = @key",bookmarks:"UPDATE bookmarks SET bookKey = @bookKey, cfi = @cfi, label = @label, percentage = @percentage, chapter = @chapter WHERE key = @key",books:"UPDATE books SET name = @name, author = @author, description = @description, md5 = @md5, cover = @cover, format = @format, publisher = @publisher, size = @size, page = @page, path = @path, charset = @charset WHERE key = @key",plugins:"UPDATE plugins SET type = @type, displayName = @displayName, icon = @icon, version = @version, config = @config, autoValue = @autoValue, langList = @langList, voiceList = @voiceList, scriptSHA256 = @scriptSHA256, script = @script WHERE key = @key",words:"UPDATE words SET bookKey = @bookKey, date = @date, word = @word, sentence = @sentence, chapter = @chapter WHERE key = @key"}),deleteStatement:Oe({notes:"DELETE FROM notes WHERE key = ?",bookmarks:"DELETE FROM bookmarks WHERE key = ?",books:"DELETE FROM books WHERE key = ?",plugins:"DELETE FROM plugins WHERE key = ?",words:"DELETE FROM words WHERE key = ?"}),dropStatement:Oe({notes:"DROP TABLE IF EXISTS notes",bookmarks:"DROP TABLE IF EXISTS bookmarks",books:"DROP TABLE IF EXISTS books",plugins:"DROP TABLE IF EXISTS plugins",words:"DROP TABLE IF EXISTS words"}),getStatement:Oe(Ee),getByBookKeyStatement:Oe(Se),getByBookKeysStatement:Oe({notes:e=>`SELECT * FROM notes WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,bookmarks:e=>`SELECT * FROM bookmarks WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,words:e=>`SELECT * FROM words WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")})`}),getKeysStatement:Oe({notes:"SELECT key FROM notes",bookmarks:"SELECT key FROM bookmarks",books:"SELECT key FROM books",plugins:"SELECT key FROM plugins",words:"SELECT key FROM words"}),getWithSortAndPageStatement:Oe({notes:(e,t,i,o)=>`SELECT * FROM notes ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,bookmarks:(e,t,i,o)=>`SELECT * FROM bookmarks ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,books:(e,t,i,o)=>`SELECT * FROM books ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,plugins:(e,t,i,o)=>`SELECT * FROM plugins ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,words:(e,t,i,o)=>`SELECT * FROM words ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`}),getByKeysStatement:Oe({notes:e=>`SELECT * FROM notes WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,bookmarks:e=>`SELECT * FROM bookmarks WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,plugins:e=>`SELECT * FROM plugins WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,words:e=>`SELECT * FROM words WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`}),deleteByBookKeyStatement:Oe(Te)},jsonToSqlite:Oe({notes:e=>{let t=Object.assign({},e);return t.date=JSON.stringify(e.date),t.tag=JSON.stringify(e.tag),t},bookmarks:e=>e,books:e=>{let t=Object.assign({},e);return t.page=e.page||0,t},plugins:e=>{let t=Object.assign({},e);return e.autoValue||(t.autoValue=null),e.langList?t.langList=JSON.stringify(e.langList):t.langList=null,e.voiceList?t.voiceList=JSON.stringify(e.voiceList):t.voiceList=null,t.config=JSON.stringify(e.config),t},words:e=>{let t=Object.assign({},e);return t.date=JSON.stringify(e.date),void 0===t.sentence&&(t.sentence=""),t}}),sqliteToJson:Oe(xe)};const Ce=S,_e=T;class Pe{constructor(e,t,i){this.TokenService=e,this.ConfigService=t,this.baseUrl="china"===i?_e:Ce,this.serverRegion=i,this.refreshToken="",this.accessToken="",this.streamPromise=null,this.expiresAt=0}refreshUserToken(){return b(this,void 0,void 0,(function*(){if(this.refreshToken=yield this.TokenService.getToken("refresh_token"),!this.refreshToken)return{code:401,message:"refresh token not found"};let t=(yield e.post(this.baseUrl+"/api/v1/public/user/refresh_token",{refresh_token:this.refreshToken})).data;return 200===t.code&&(yield this.TokenService.setToken("access_token",t.data.access_token),yield this.TokenService.setToken("refresh_token",t.data.refresh_token),yield this.TokenService.setToken("expires_at",(1e3*t.data.expires_at).toString()),this.accessToken=t.data.access_token,this.refreshToken=t.data.refresh_token,this.expiresAt=1e3*t.data.expires_at),t}))}requestWithRetry(e){return b(this,void 0,void 0,(function*(){return Pe.requestQueue||(Pe.requestQueue=[]),new Promise(((t,i)=>{Pe.requestQueue.push({config:e,resolve:t,reject:i}),Pe.processingQueue||this.processQueue()}))}))}isTokenValid(){return b(this,void 0,void 0,(function*(){if(this.accessToken||(this.accessToken=(yield this.TokenService.getToken("access_token"))||""),!this.expiresAt){const e=yield this.TokenService.getToken("expires_at");this.expiresAt=e?parseInt(e):(new Date).getTime()+31536e9}return""!==this.accessToken&&this.expiresAt>(new Date).getTime()+6e4}))}processQueue(){return b(this,void 0,void 0,(function*(){if(!Pe.processingQueue){Pe.processingQueue=!0;try{for(;Pe.requestQueue.length>0;){const e=Pe.requestQueue.shift();try{let t=yield this.executeRequest(e.config);e.resolve(t)}catch(t){e.reject(t)}}}finally{Pe.processingQueue=!1}}}))}executeRequest(t){return b(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let i="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);if(t.baseURL=this.baseUrl,t.headers)t.headers.Authorization="Bearer "+this.accessToken,t.headers["X-Request-ID"]=i;else{let e=this.ConfigService.getItem("appVersion"),o=this.ConfigService.getItem("appPlatform");t.headers={Authorization:"Bearer "+this.accessToken,"X-Request-ID":i,"X-App-Version":e||"1.0.0","X-App-Platform":o||"web"}}let o=(yield e(t)).data;if(402===o.code){let i=yield this.refreshUserToken();if(200===i.code){return t.headers=t.headers||{},t.headers.Authorization="Bearer "+this.accessToken,(yield e(t)).data}return i}return 200!==o.code&&console.error("Request error:",o),o}catch(e){return console.error("Request execution error:",e),"Network Error"===e.message?{code:503,message:"network error",data:null,msg:"Network error, please try again later. 网络错误,请稍后再试。"}:{code:500,message:e.message||"Unknown error",msg:e.message||"Unknown error",data:null}}}))}requestWithStream(e,t,i){return b(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>b(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let o=this.accessToken||"",r="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((s,n)=>{let a=this.ConfigService.getItem("appVersion"),d=this.ConfigService.getItem("appPlatform");const l=new i(this.baseUrl+e.url,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+o,"X-Request-ID":r,"X-App-Version":a||"1.0.0","X-App-Platform":d||"web"},method:e.method,body:JSON.stringify(e.data),pollingInterval:0});l.addEventListener("open",(()=>{console.info("Connection to OpenAI established.")})),l.addEventListener("message",(e=>b(this,void 0,void 0,(function*(){if(!e.data)return;const i=JSON.parse(e.data);i.done?(l.close(),s(i)):t(i.data)})))),l.addEventListener("error",(e=>{if(console.info("Error:",e),!e.data)return;const i=JSON.parse(e.data);t(i.data),s(i),l.close()}))}))}finally{this.streamPromise=null}})))()),this.streamPromise}))}requestWithFetch(e,t){return b(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>b(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let i=this.accessToken||"",o="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((r,s)=>b(this,void 0,void 0,(function*(){let s=this.ConfigService.getItem("appVersion"),n=this.ConfigService.getItem("appPlatform");var a=new v(this.baseUrl+e.url,{headers:{"Content-Type":"text/plain",Authorization:"Bearer "+i,"X-Request-ID":o,"X-App-Version":s||"1.0.0","X-App-Platform":n||"web"},payload:JSON.stringify(e.data),method:"POST"});a.addEventListener("message",(e=>b(this,void 0,void 0,(function*(){if(!e.data)return;const i=JSON.parse(e.data);i.done?(a.close(),r(i)):t(i.data)})))),a.addEventListener("open",(e=>{console.info(e,"Connection to OpenAI established.")})),a.addEventListener("error",(e=>{if(console.error(e,"Error occurred while connecting to OpenAI"),!e.data)return;const i=JSON.parse(e.data);t(i.data),r(i),a.close()}))}))))}finally{this.streamPromise=null}})))()),this.streamPromise}))}}Pe.processingQueue=!1,Pe.requestQueue=[];class Ae extends Pe{constructor(e,t,i){super(e,t,i),this.serverRegion=i}encryptToken(e){return b(this,void 0,void 0,(function*(){let t=e.token,i=w.encode(t),{extracted:o,remaining:r}=function(e){let t="",i="",o=[],r=1;for(;r<=e.length;)o.push(r-1),r*=2;for(let r=0;r-1){let i=t.split("#");e.encrypted_token=i[1]}const i={method:"post",url:"/api/v1/pro/thirdparty/decrypt_token",data:e};let o=yield this.requestWithRetry(i);if(t.indexOf("#")>-1&&o.data&&o.data.token){let e=t.split("#"),i=function(e,t){let i="",o=[],r=1,s=e.length+t.length;for(;r<=s;)o.push(r-1),r*=2;let n=0,a=0;for(let r=0;r-1&&i.splice(o,1),this.setAllListConfig(i,t)}static setListConfig(e,t){let i=this.getAllListConfig(t);const o=i.indexOf(e);o>-1?(i.splice(o,1),i.unshift(e)):i.unshift(e),this.setAllListConfig(i,t)}static setAllListConfig(e,t,i=!0){this.setItem(t,JSON.stringify(e)),i&&this.setSyncRecord({type:"config",catergory:"listConfig",name:"general",key:t},{operation:"update",time:Date.now()})}static setObjectConfig(e,t,i,o=!0){let r=this.getAllObjectConfig(i);r[e]=t,o&&this.setSyncRecord({type:"config",catergory:"objectConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllObjectConfig(r,i)}static getObjectConfig(e,t,i){return this.getAllObjectConfig(t)[e]||i}static getAllObjectConfig(e){let t=this.getItem(e);return JSON.parse(t)||{}}static setAllObjectConfig(e,t){this.setItem(t,JSON.stringify(e))}static deleteObjectConfig(e,t){let i=this.getAllObjectConfig(t);delete i[e],this.setSyncRecord({type:"config",catergory:"objectConfig",name:t,key:e},{operation:"delete",time:Date.now()}),this.setAllObjectConfig(i,t)}static getAllMapConfig(e){let t=this.getItem(e);return JSON.parse(t)||{}}static getMapConfig(e,t){return this.getAllMapConfig(t)[e]||[]}static setAllMapConfig(e,t){this.setItem(t,JSON.stringify(e))}static setMapConfig(e,t,i){let o=this.getAllMapConfig(i);void 0===o[e]&&(o[e]=[]),t&&-1===o[e].indexOf(t)&&o[e].unshift(t),this.setSyncRecord({type:"config",catergory:"mapConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,i)}static setOneMapConfig(e,t,i,o=!0){let r=this.getAllMapConfig(i);r[e]=t,o&&this.setSyncRecord({type:"config",catergory:"mapConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(r,i)}static deleteFromMapConfig(e,t,i){let o=this.getAllMapConfig(i),r=o[e].indexOf(t);o[e].splice(r,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,i)}static deleteFromAllMapConfig(e,t){let i=this.getAllMapConfig(t);Object.keys(i).forEach((o=>{let r=i[o].indexOf(e);r>-1&&(i[o].splice(r,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:o},{operation:"update",time:Date.now()}))})),this.setAllMapConfig(i,t)}static deleteMapConfig(e,t){let i=this.getAllMapConfig(t);delete i[e],this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"delete",time:Date.now()}),this.setAllMapConfig(i,t)}static getFromAllMapConfig(e,t){let i=this.getAllMapConfig(t),o=[];for(let t in i)i[t]&&i[t].indexOf(e)>-1&&o.push(t);return o}static getSyncRecord(e){return JSON.parse(this.getItem("syncRecord")||"{}")[e.type+"."+e.catergory+"."+e.name+"."+e.key]||{operation:"",time:0}}static getAllSyncRecord(){return JSON.parse(this.getItem("syncRecord")||"{}")}static setSyncRecord(e,t){const i=e.type+"."+e.catergory+"."+e.name+"."+e.key;let o=JSON.parse(this.getItem("syncRecord")||"{}");o[i]=t,this.setItem("syncRecord",JSON.stringify(o))}static setAllSyncRecord(e){this.setItem("syncRecord",JSON.stringify(e))}});var Le,ze;export{$e as ConfigService,Re as SqlStatement,Fe as SyncUtil,Ae as ThirdpartyRequest}; From bc426133d230ee6e4c698369c8de8f5bfa93c663 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Wed, 30 Sep 2026 17:49:51 +0800 Subject: [PATCH 10/42] feat: add priority support and unlock Pro features to login list --- src/assets/locales/zh-CN.json | 4 +++- src/constants/loginList.tsx | 2 ++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/assets/locales/zh-CN.json b/src/assets/locales/zh-CN.json index 39d4eb95..873afcf0 100644 --- a/src/assets/locales/zh-CN.json +++ b/src/assets/locales/zh-CN.json @@ -14,6 +14,7 @@ "Horizontal": "横排", "You can add models manually by selecting the custom model": "您可以通过选择自定义模型来手动添加模型", "Vertical": "竖排", + "Priority support": "优先客服支持", "Synchronisation successful": "同步成功", "Permanently Delete": "永久删除", "Default search engine": "默认搜索引擎", @@ -261,6 +262,7 @@ "Audio loading failed, stopped playback": "音频加载失败,已停止播放", "The text is too long to analyze": "文本过长无法分析", "Analysis failed": "分析失败", + "Unlock Pro features on all Platform": "一次购买全平台通用", "Analyzing roles, please wait...": "正在分析角色,请稍候...", "Compare Free and Pro features": "免费版和专业版功能对比", "Recommended (use with Nutstore)": "推荐使用(配合坚果云)", @@ -1377,4 +1379,4 @@ "Reading ruler height (lines)": "阅读标尺高度(行)", "Reading ruler background opacity": "阅读标尺背景透明度", "ISBN": "ISBN" -} \ No newline at end of file +} diff --git a/src/constants/loginList.tsx b/src/constants/loginList.tsx index 03c1e3c8..ff12b9dd 100644 --- a/src/constants/loginList.tsx +++ b/src/constants/loginList.tsx @@ -32,5 +32,7 @@ export const proFeatures = [ "AI reading aids (chapter summaries, outline, multi-role narration)", "Natural text-to-speech (82 languages, 569 voices)", "OCR text recognition for scanned PDFs", + "Unlock Pro features on all Platform", "Send to Kindle", + "Priority support", ]; From 6c5324fe82cbfa09f473b520601e313518de9696 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Thu, 1 Oct 2026 09:36:03 +0800 Subject: [PATCH 11/42] feat: add disclaimer for AI-generated content in PopupAssist --- src/components/popups/popupAssist/component.tsx | 16 ++++++++++++++++ .../popups/popupAssist/popupAssist.css | 7 +++++++ 2 files changed, 23 insertions(+) diff --git a/src/components/popups/popupAssist/component.tsx b/src/components/popups/popupAssist/component.tsx index 1bca023a..f32a2bed 100644 --- a/src/components/popups/popupAssist/component.tsx +++ b/src/components/popups/popupAssist/component.tsx @@ -518,6 +518,15 @@ class PopupAssist extends React.Component { )} + {item.role === "assistant" && + index === message.length - 1 && + this.state.answer === "" && ( +
+ {this.props.t( + "AI-generated content is for reference only. Please verify carefully as it does not constitute professional advice." + )} +
+ )} ); }); @@ -827,6 +836,13 @@ class PopupAssist extends React.Component { replace: (_domNode) => {}, } )} + {this.state.answer && ( +
+ {this.props.t( + "AI-generated content is for reference only. Please verify carefully as it does not constitute professional advice." + )} +
+ )} ) : (
diff --git a/src/components/popups/popupAssist/popupAssist.css b/src/components/popups/popupAssist/popupAssist.css index 3fb3629b..b7fa1e5f 100644 --- a/src/components/popups/popupAssist/popupAssist.css +++ b/src/components/popups/popupAssist/popupAssist.css @@ -55,6 +55,13 @@ margin-left: 16px; line-height: 1; } +.popup-assist-disclaimer { + margin-top: 8px; + font-size: 12px; + line-height: 1.4; + opacity: 0.6; + user-select: none; +} @keyframes spin { from { transform: rotate(0deg); From 05050b536697bbf480ea2de97f67ec47792402d9 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Thu, 1 Oct 2026 09:38:09 +0800 Subject: [PATCH 12/42] fix: remove redundant disclaimer rendering in PopupAssist --- src/components/popups/popupAssist/component.tsx | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/components/popups/popupAssist/component.tsx b/src/components/popups/popupAssist/component.tsx index f32a2bed..5f7a5301 100644 --- a/src/components/popups/popupAssist/component.tsx +++ b/src/components/popups/popupAssist/component.tsx @@ -519,8 +519,7 @@ class PopupAssist extends React.Component {
)} {item.role === "assistant" && - index === message.length - 1 && - this.state.answer === "" && ( + index === message.length - 1 && (
{this.props.t( "AI-generated content is for reference only. Please verify carefully as it does not constitute professional advice." @@ -836,13 +835,6 @@ class PopupAssist extends React.Component { replace: (_domNode) => {}, } )} - {this.state.answer && ( -
- {this.props.t( - "AI-generated content is for reference only. Please verify carefully as it does not constitute professional advice." - )} -
- )}
) : (
From ae6f18a1f2b7a34e2d22f3ea7083835900ae4529 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Thu, 1 Oct 2026 09:42:17 +0800 Subject: [PATCH 13/42] feat: add disclaimer for AI-generated content in PopupDict --- src/components/popups/popupDict/component.tsx | 7 +++++++ src/components/popups/popupDict/popupDict.css | 8 ++++++++ 2 files changed, 15 insertions(+) diff --git a/src/components/popups/popupDict/component.tsx b/src/components/popups/popupDict/component.tsx index aecd5507..e138fe24 100644 --- a/src/components/popups/popupDict/component.tsx +++ b/src/components/popups/popupDict/component.tsx @@ -537,6 +537,13 @@ class PopupDict extends React.Component { )}
)} + {!this.state.isAiWaiting && this.state.aiAnswer && ( +
+ {this.props.t( + "AI-generated content is for reference only. Please verify carefully as it does not constitute professional advice." + )} +
+ )} )} diff --git a/src/components/popups/popupDict/popupDict.css b/src/components/popups/popupDict/popupDict.css index e9b5d7c6..4cff207e 100644 --- a/src/components/popups/popupDict/popupDict.css +++ b/src/components/popups/popupDict/popupDict.css @@ -238,3 +238,11 @@ line-height: 22px; user-select: text; } + +.popup-assist-disclaimer { + margin-top: 8px; + font-size: 12px; + line-height: 1.4; + opacity: 0.6; + user-select: none; +} From 70b1b94484756cd51854c8f48cd958125f570b8e Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Thu, 1 Oct 2026 09:45:31 +0800 Subject: [PATCH 14/42] feat: add isAiStreaming state to manage AI streaming status in PopupDict --- src/components/popups/popupDict/component.tsx | 20 +++++++++++++------ src/components/popups/popupDict/interface.tsx | 1 + 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/components/popups/popupDict/component.tsx b/src/components/popups/popupDict/component.tsx index e138fe24..9d18de9a 100644 --- a/src/components/popups/popupDict/component.tsx +++ b/src/components/popups/popupDict/component.tsx @@ -50,6 +50,7 @@ class PopupDict extends React.Component { isShowUrl: false, aiAnswer: "", isAiWaiting: false, + isAiStreaming: false, }; } @@ -162,7 +163,7 @@ class PopupDict extends React.Component { systemPrompt = systemPrompt.replace("{to}", targetLang); let config: any = plugin.config || {}; this.aiTextAccumulator = ""; - this.setState({ aiAnswer: "", isAiWaiting: true }); + this.setState({ aiAnswer: "", isAiWaiting: true, isAiStreaming: true }); this.startUpdateInterval(); await chatStream( config.endpoint, @@ -185,7 +186,11 @@ class PopupDict extends React.Component { ); this.stopUpdateInterval(); this.aiTextAccumulator = ""; - this.setState({ isAiWaiting: false, dictText: " " }); + this.setState({ + isAiWaiting: false, + isAiStreaming: false, + dictText: " ", + }); return ""; } else if ( ConfigService.getReaderConfig("dictService") && @@ -288,6 +293,7 @@ class PopupDict extends React.Component { console.error(error); this.setState({ dictText: this.props.t("Error happened"), + isAiStreaming: false, }); return ""; } @@ -295,7 +301,7 @@ class PopupDict extends React.Component { handleDictionaryStream = async (text: string, isFullAnalysis: boolean) => { try { this.aiTextAccumulator = ""; - this.setState({ aiAnswer: "", isAiWaiting: true }); + this.setState({ aiAnswer: "", isAiWaiting: true, isAiStreaming: true }); this.startUpdateInterval(); let res = await getDictionaryStream( text, @@ -315,12 +321,12 @@ class PopupDict extends React.Component { this.stopUpdateInterval(); this.aiTextAccumulator = ""; if (res && res.done) { - this.setState({ isAiWaiting: false }); + this.setState({ isAiWaiting: false, isAiStreaming: false }); } } catch (error) { this.stopUpdateInterval(); this.aiTextAccumulator = ""; - this.setState({ isAiWaiting: false }); + this.setState({ isAiWaiting: false, isAiStreaming: false }); console.error(error); } }; @@ -537,7 +543,9 @@ class PopupDict extends React.Component { )} )} - {!this.state.isAiWaiting && this.state.aiAnswer && ( + {!this.state.isAiWaiting && + !this.state.isAiStreaming && + this.state.aiAnswer && (
{this.props.t( "AI-generated content is for reference only. Please verify carefully as it does not constitute professional advice." diff --git a/src/components/popups/popupDict/interface.tsx b/src/components/popups/popupDict/interface.tsx index a6f6c9c9..f1ca3cc3 100644 --- a/src/components/popups/popupDict/interface.tsx +++ b/src/components/popups/popupDict/interface.tsx @@ -25,4 +25,5 @@ export interface PopupDictState { isShowUrl: boolean; aiAnswer: string; isAiWaiting: boolean; + isAiStreaming: boolean; } From 136a4f3e1c7ab5abc4fb6b1fd3e5a3e8b66631be Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Thu, 1 Oct 2026 10:06:25 +0800 Subject: [PATCH 15/42] Enhance dropdown styling in BookList component for improved UI --- src/assets/lib/kookit.min.js | 2 +- src/containers/lists/bookList/component.tsx | 7 ++++++- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/src/assets/lib/kookit.min.js b/src/assets/lib/kookit.min.js index 87f309bd..4cc92d6d 100644 --- a/src/assets/lib/kookit.min.js +++ b/src/assets/lib/kookit.min.js @@ -1 +1 @@ -import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 150px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 150px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle;!canvas.freeDrawingBrush||isShape||isText||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText,drawing?isText?(canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text"):(canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair"):(canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move")}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; +import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle;!canvas.freeDrawingBrush||isShape||isText||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText,drawing?isText?(canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text"):(canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair"):(canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move")}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; diff --git a/src/containers/lists/bookList/component.tsx b/src/containers/lists/bookList/component.tsx index de63a37e..4a8044c3 100644 --- a/src/containers/lists/bookList/component.tsx +++ b/src/containers/lists/bookList/component.tsx @@ -449,7 +449,12 @@ class BookList extends React.Component { onChange={(e) => { this.setState({ readingStatusFilter: e.target.value }); }} - style={{ marginRight: "10px", width: "70px", borderWidth: "0px" }} + style={{ + marginRight: "10px", + width: "70px", + borderWidth: "0px", + backgroundColor: "transparent", + }} >
{annotationStyle === "brush" ? ( @@ -531,6 +570,32 @@ class AnnotationDialog extends React.Component< + ) : annotationStyle === "eraser" ? ( + <> +
+
+ {this.props.t("Eraser size")} +
+
    + {ERASER_WIDTHS.map((width) => ( +
  • this.handleSelectEraserWidth(width)} + > + +
  • + ))} +
+
+ ) : ( <>
diff --git a/src/components/dialogs/annotationDialog/interface.tsx b/src/components/dialogs/annotationDialog/interface.tsx index 1d5b6219..e89ace6c 100644 --- a/src/components/dialogs/annotationDialog/interface.tsx +++ b/src/components/dialogs/annotationDialog/interface.tsx @@ -17,6 +17,7 @@ export interface AnnotationDialogState { annotationShapeType: string; annotationShapeColor: string; annotationShapeWidth: number; + annotationEraserWidth: number; annotationTextSize: number; annotationTextFont: string; annotationTextColor: string; diff --git a/src/containers/viewer/component.tsx b/src/containers/viewer/component.tsx index a27d40c8..b2a57e82 100644 --- a/src/containers/viewer/component.tsx +++ b/src/containers/viewer/component.tsx @@ -15,6 +15,7 @@ import PageWidget from "../pageWidget"; import { BRUSH_COLORS, BRUSH_WIDTHS, + ERASER_WIDTHS, HIGHLIGHTER_COLORS, HIGHLIGHTER_WIDTHS, SHAPE_TYPES, @@ -391,6 +392,10 @@ class Viewer extends React.Component { ConfigService.getReaderConfig("annotationShapeWidth") || BRUSH_WIDTHS[1] + "" ), + eraserWidth: parseFloat( + ConfigService.getReaderConfig("annotationEraserWidth") || + ERASER_WIDTHS[2] + "" + ), textSize: parseFloat( ConfigService.getReaderConfig("annotationTextSize") || "24" ), diff --git a/src/utils/common.ts b/src/utils/common.ts index b0eb5aa5..e7b59a29 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -1929,6 +1929,7 @@ export const BRUSH_COLORS = [ ]; export const BRUSH_WIDTHS = [2, 4, 8, 14]; +export const ERASER_WIDTHS = [10, 18, 28, 40]; export const HIGHLIGHTER_COLORS = [ "#FFE54C", "#6FFB6B", From 0955ac9775837725026459c8164ca522d9711549 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Thu, 1 Oct 2026 10:41:46 +0800 Subject: [PATCH 17/42] feat: refactor eraser width handling and update related styles in AnnotationDialog --- .../annotationDialog/annotationDialog.css | 15 +--- .../dialogs/annotationDialog/component.tsx | 78 +++++++++---------- src/containers/viewer/component.tsx | 4 +- src/utils/common.ts | 5 +- 4 files changed, 43 insertions(+), 59 deletions(-) diff --git a/src/components/dialogs/annotationDialog/annotationDialog.css b/src/components/dialogs/annotationDialog/annotationDialog.css index fe5e2acc..ab081b1f 100644 --- a/src/components/dialogs/annotationDialog/annotationDialog.css +++ b/src/components/dialogs/annotationDialog/annotationDialog.css @@ -121,25 +121,12 @@ .annotation-dialog-tab-icon { font-size: 18px; } -.annotation-dialog-tab-shape, -.annotation-dialog-tab-eraser { +.annotation-dialog-tab-shape { display: flex; align-items: center; justify-content: center; line-height: 0; } -.annotation-eraser-width-list { - gap: 6px; - flex-wrap: wrap; -} -.annotation-eraser-preview { - display: block; - border: 2px solid var(--text-color, currentColor); - border-radius: 50%; - box-sizing: border-box; - max-width: 40px; - max-height: 40px; -} .annotation-shape-list { display: flex; flex-wrap: wrap; diff --git a/src/components/dialogs/annotationDialog/component.tsx b/src/components/dialogs/annotationDialog/component.tsx index 86c9099c..6093e176 100644 --- a/src/components/dialogs/annotationDialog/component.tsx +++ b/src/components/dialogs/annotationDialog/component.tsx @@ -6,7 +6,10 @@ import { ConfigService } from "../../../assets/lib/kookit-extra-browser.min"; import { BRUSH_COLORS, BRUSH_WIDTHS, - ERASER_WIDTHS, + ERASER_WIDTH_DEFAULT, + ERASER_WIDTH_MAX, + ERASER_WIDTH_MIN, + ERASER_WIDTH_STEP, HIGHLIGHTER_COLORS, HIGHLIGHTER_WIDTHS, SHAPE_TYPES, @@ -54,7 +57,7 @@ class AnnotationDialog extends React.Component< ), annotationEraserWidth: parseFloat( ConfigService.getReaderConfig("annotationEraserWidth") || - ERASER_WIDTHS[2] + "" + ERASER_WIDTH_DEFAULT + "" ), annotationTextSize: parseFloat( ConfigService.getReaderConfig("annotationTextSize") || "24" @@ -154,6 +157,12 @@ class AnnotationDialog extends React.Component< }); ConfigService.setReaderConfig("annotationEraserWidth", width + ""); }; + handleEraserWidthRelease = () => { + ConfigService.setReaderConfig( + "annotationEraserWidth", + this.state.annotationEraserWidth + "" + ); + }; handleSelectTextSize = (size: number) => { this.setState({ annotationTextSize: size }); this.props.htmlBook.rendition.applyAnnotationConfig({ @@ -346,22 +355,10 @@ class AnnotationDialog extends React.Component< onClick={() => this.handleSelectTab("eraser")} title={this.props.t("Eraser")} > - - - - - - - +
@@ -571,31 +568,28 @@ class AnnotationDialog extends React.Component< ) : annotationStyle === "eraser" ? ( - <> -
-
- {this.props.t("Eraser size")} -
-
    - {ERASER_WIDTHS.map((width) => ( -
  • this.handleSelectEraserWidth(width)} - > - -
  • - ))} -
+
+
+ {this.props.t("Eraser size")} + + {annotationEraserWidth} +
- + + this.handleSelectEraserWidth(parseFloat(e.target.value)) + } + onPointerUp={this.handleEraserWidthRelease} + onMouseUp={this.handleEraserWidthRelease} + style={{ width: "100%" }} + /> +
) : ( <>
diff --git a/src/containers/viewer/component.tsx b/src/containers/viewer/component.tsx index b2a57e82..04d94b19 100644 --- a/src/containers/viewer/component.tsx +++ b/src/containers/viewer/component.tsx @@ -15,7 +15,7 @@ import PageWidget from "../pageWidget"; import { BRUSH_COLORS, BRUSH_WIDTHS, - ERASER_WIDTHS, + ERASER_WIDTH_DEFAULT, HIGHLIGHTER_COLORS, HIGHLIGHTER_WIDTHS, SHAPE_TYPES, @@ -394,7 +394,7 @@ class Viewer extends React.Component { ), eraserWidth: parseFloat( ConfigService.getReaderConfig("annotationEraserWidth") || - ERASER_WIDTHS[2] + "" + ERASER_WIDTH_DEFAULT + "" ), textSize: parseFloat( ConfigService.getReaderConfig("annotationTextSize") || "24" diff --git a/src/utils/common.ts b/src/utils/common.ts index e7b59a29..f3e618cb 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -1929,7 +1929,10 @@ export const BRUSH_COLORS = [ ]; export const BRUSH_WIDTHS = [2, 4, 8, 14]; -export const ERASER_WIDTHS = [10, 18, 28, 40]; +export const ERASER_WIDTH_MIN = 6; +export const ERASER_WIDTH_MAX = 60; +export const ERASER_WIDTH_STEP = 2; +export const ERASER_WIDTH_DEFAULT = 24; export const HIGHLIGHTER_COLORS = [ "#FFE54C", "#6FFB6B", From 0bf027851a60822291c009d22722a7647836766a Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Thu, 1 Oct 2026 11:02:06 +0800 Subject: [PATCH 18/42] Add Quick Erase feature to Annotation Dialog - Added "Quick erase" option to the English and Chinese locale files. - Implemented UI components and styles for the Quick Erase toggle in the Annotation Dialog. - Updated the component state to manage the Quick Erase setting. - Integrated Quick Erase functionality with the existing annotation configuration. --- src/assets/lib/kookit.min.js | 2 +- src/assets/locales/en.json | 1 + src/assets/locales/zh-CN.json | 1 + .../annotationDialog/annotationDialog.css | 30 +++++++ .../dialogs/annotationDialog/component.tsx | 78 ++++++++++++++----- .../dialogs/annotationDialog/interface.tsx | 1 + src/containers/viewer/component.tsx | 2 + 7 files changed, 94 insertions(+), 21 deletions(-) diff --git a/src/assets/lib/kookit.min.js b/src/assets/lib/kookit.min.js index 2974660a..26c3a872 100644 --- a/src/assets/lib/kookit.min.js +++ b/src/assets/lib/kookit.min.js @@ -1 +1 @@ -import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));if(0===targets.length)return;const history=this.fabricHistoryMap.get(chapterDocIndex);targets.forEach(obj=>{if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canvas.remove(obj)}),canvas.requestRenderAll()};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; +import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index 20281d53..a0470aa2 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -325,6 +325,7 @@ "Text color": "Text color", "Eraser": "Eraser", "Eraser size": "Eraser size", + "Quick erase": "Quick erase", "Export": "Export", "Restore": "Restore", "Publisher": "Publisher", diff --git a/src/assets/locales/zh-CN.json b/src/assets/locales/zh-CN.json index b9485c55..a69476f7 100644 --- a/src/assets/locales/zh-CN.json +++ b/src/assets/locales/zh-CN.json @@ -474,6 +474,7 @@ "Text color": "文字颜色", "Eraser": "橡皮擦", "Eraser size": "橡皮擦大小", + "Quick erase": "快速擦除", "Export": "导出", "Publisher": "出版商", "Added on": "添加于", diff --git a/src/components/dialogs/annotationDialog/annotationDialog.css b/src/components/dialogs/annotationDialog/annotationDialog.css index ab081b1f..183a9900 100644 --- a/src/components/dialogs/annotationDialog/annotationDialog.css +++ b/src/components/dialogs/annotationDialog/annotationDialog.css @@ -184,6 +184,36 @@ .annotation-text-size-section { margin-bottom: 20px; } +.annotation-quick-erase-container { + display: flex; + align-items: center; + justify-content: space-between; + cursor: pointer; + transition: opacity 0.15s; +} +.annotation-quick-erase-container:hover { + opacity: 0.85; +} +.annotation-quick-erase-title { + font-size: 13px; +} +.annotation-quick-erase-switch { + display: flex; + width: 40px; + height: 20px; + border-radius: 10px; + background-color: var(--text-color, #2c2c2c); + transition: opacity 0.15s; +} +.annotation-quick-erase-button { + display: inline-block; + height: 16px; + width: 16px; + border-radius: 50%; + margin: 2px; + background-color: var(--background-color, #fff); + transition: transform 0.3s ease; +} .annotation-text-font-select { width: 100% !important; left: 0 !important; diff --git a/src/components/dialogs/annotationDialog/component.tsx b/src/components/dialogs/annotationDialog/component.tsx index 6093e176..c79b0f63 100644 --- a/src/components/dialogs/annotationDialog/component.tsx +++ b/src/components/dialogs/annotationDialog/component.tsx @@ -59,6 +59,8 @@ class AnnotationDialog extends React.Component< ConfigService.getReaderConfig("annotationEraserWidth") || ERASER_WIDTH_DEFAULT + "" ), + annotationQuickErase: + ConfigService.getReaderConfig("annotationQuickErase") || "no", annotationTextSize: parseFloat( ConfigService.getReaderConfig("annotationTextSize") || "24" ), @@ -163,6 +165,14 @@ class AnnotationDialog extends React.Component< this.state.annotationEraserWidth + "" ); }; + handleToggleQuickErase = () => { + const next = this.state.annotationQuickErase === "yes" ? "no" : "yes"; + this.setState({ annotationQuickErase: next }); + this.props.htmlBook.rendition.applyAnnotationConfig({ + quickErase: next, + }); + ConfigService.setReaderConfig("annotationQuickErase", next); + }; handleSelectTextSize = (size: number) => { this.setState({ annotationTextSize: size }); this.props.htmlBook.rendition.applyAnnotationConfig({ @@ -255,6 +265,7 @@ class AnnotationDialog extends React.Component< annotationShapeColor, annotationShapeWidth, annotationEraserWidth, + annotationQuickErase, annotationTextSize, annotationTextFont, annotationTextColor, @@ -568,28 +579,55 @@ class AnnotationDialog extends React.Component<
) : annotationStyle === "eraser" ? ( -
-
- {this.props.t("Eraser size")} - - {annotationEraserWidth} + <> +
+
+ {this.props.t("Eraser size")} + + {annotationEraserWidth} + +
+ + this.handleSelectEraserWidth(parseFloat(e.target.value)) + } + onPointerUp={this.handleEraserWidthRelease} + onMouseUp={this.handleEraserWidthRelease} + style={{ width: "100%" }} + /> +
+
+ + {this.props.t("Quick erase")} + + +
- - this.handleSelectEraserWidth(parseFloat(e.target.value)) - } - onPointerUp={this.handleEraserWidthRelease} - onMouseUp={this.handleEraserWidthRelease} - style={{ width: "100%" }} - /> -
+ ) : ( <>
diff --git a/src/components/dialogs/annotationDialog/interface.tsx b/src/components/dialogs/annotationDialog/interface.tsx index e89ace6c..2273dd86 100644 --- a/src/components/dialogs/annotationDialog/interface.tsx +++ b/src/components/dialogs/annotationDialog/interface.tsx @@ -18,6 +18,7 @@ export interface AnnotationDialogState { annotationShapeColor: string; annotationShapeWidth: number; annotationEraserWidth: number; + annotationQuickErase: string; annotationTextSize: number; annotationTextFont: string; annotationTextColor: string; diff --git a/src/containers/viewer/component.tsx b/src/containers/viewer/component.tsx index 04d94b19..b387f198 100644 --- a/src/containers/viewer/component.tsx +++ b/src/containers/viewer/component.tsx @@ -396,6 +396,8 @@ class Viewer extends React.Component { ConfigService.getReaderConfig("annotationEraserWidth") || ERASER_WIDTH_DEFAULT + "" ), + quickErase: ConfigService.getReaderConfig("annotationQuickErase") || + "no", textSize: parseFloat( ConfigService.getReaderConfig("annotationTextSize") || "24" ), From e85b6914d5f7e3e49e7ecc39d6ece72c58683de2 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Thu, 1 Oct 2026 11:14:05 +0800 Subject: [PATCH 19/42] fix bug --- src/assets/lib/kookit.min.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/assets/lib/kookit.min.js b/src/assets/lib/kookit.min.js index 26c3a872..78f3e8bf 100644 --- a/src/assets/lib/kookit.min.js +++ b/src/assets/lib/kookit.min.js @@ -1 +1 @@ -import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; +import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.quickErase="no",this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.quickErase=config.quickErase||"no",this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),config.quickErase&&this.setQuickErase(config.quickErase),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),"yes"===this.quickErase)canvas.remove(obj);else if(this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setQuickErase(quickErase){this.quickErase=quickErase}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; From ea81cf218f12e0c34c27e4b466045d18b64c048f Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Thu, 1 Oct 2026 14:14:11 +0800 Subject: [PATCH 20/42] feat: add authentication check for background image URLs and update related methods --- .../popups/popupRefer/component.tsx | 2 ++ .../settings/backgroundSetting/component.tsx | 11 ++++++-- .../settings/backgroundSetting/index.tsx | 5 ++-- .../settings/backgroundSetting/interface.tsx | 1 + src/utils/file/backgroundUtil.ts | 26 ++++++++++++------- 5 files changed, 32 insertions(+), 13 deletions(-) diff --git a/src/components/popups/popupRefer/component.tsx b/src/components/popups/popupRefer/component.tsx index 769a098a..94d29411 100644 --- a/src/components/popups/popupRefer/component.tsx +++ b/src/components/popups/popupRefer/component.tsx @@ -5,6 +5,7 @@ import { getIframeDoc } from "../../../utils/reader/docUtil"; import { isReadingRawPDF, openExternalUrl } from "../../../utils/common"; import Parser from "html-react-parser"; import { ConfigService } from "../../../assets/lib/kookit-extra-browser.min"; +import toast from "react-hot-toast"; class PopupRefer extends React.Component { highlighter: any; @@ -179,6 +180,7 @@ class PopupRefer extends React.Component { navigator.clipboard.writeText( this.state.footnote.replace(/<[^>]+>/g, "").trim() ); + toast.success(this.props.t("Copying successful")); }} > {this.props.t("Copy")} diff --git a/src/containers/settings/backgroundSetting/component.tsx b/src/containers/settings/backgroundSetting/component.tsx index 0c414d0c..2f038d36 100644 --- a/src/containers/settings/backgroundSetting/component.tsx +++ b/src/containers/settings/backgroundSetting/component.tsx @@ -240,6 +240,7 @@ class BackgroundSetting extends React.Component< try { const dataUrl = await BackgroundUtil.downloadFeaturedBackground( index, + this.props.isAuthed, (progress) => this.setState({ downloadProgress: progress }) ); if (!dataUrl) { @@ -455,7 +456,10 @@ class BackgroundSetting extends React.Component< {visibleFeatured.has(index) ? ( {id} @@ -570,7 +574,10 @@ class BackgroundSetting extends React.Component< /> {BackgroundUtil.getFeaturedBackgroundId(previewFeatured)} e.stopPropagation()} /> diff --git a/src/containers/settings/backgroundSetting/index.tsx b/src/containers/settings/backgroundSetting/index.tsx index ab0ece52..75e30e22 100644 --- a/src/containers/settings/backgroundSetting/index.tsx +++ b/src/containers/settings/backgroundSetting/index.tsx @@ -3,9 +3,10 @@ import BackgroundSetting from "./component"; import { withTranslation } from "react-i18next"; import { withRouter } from "react-router-dom"; import { handleReaderBackgroundImage } from "../../../store/actions/reader"; +import { stateType } from "../../../store"; -const mapStateToProps = () => { - return {}; +const mapStateToProps = (state: stateType) => { + return { isAuthed: state.manager.isAuthed }; }; const actionCreator = { handleReaderBackgroundImage }; export default connect( diff --git a/src/containers/settings/backgroundSetting/interface.tsx b/src/containers/settings/backgroundSetting/interface.tsx index 365b354d..dbb00327 100644 --- a/src/containers/settings/backgroundSetting/interface.tsx +++ b/src/containers/settings/backgroundSetting/interface.tsx @@ -1,6 +1,7 @@ import { RouteComponentProps } from "react-router-dom"; export interface SettingInfoProps extends RouteComponentProps { + isAuthed: boolean; t: (title: string) => string; handleReaderBackgroundImage?: (readerBackgroundImage: string) => void; } diff --git a/src/utils/file/backgroundUtil.ts b/src/utils/file/backgroundUtil.ts index 173951a9..be603cda 100644 --- a/src/utils/file/backgroundUtil.ts +++ b/src/utils/file/backgroundUtil.ts @@ -1,5 +1,5 @@ import { isElectron } from "react-device-detect"; -import { getStorageLocation } from "../common"; +import { getServerRegion, getStorageLocation } from "../common"; import { ConfigService } from "../../assets/lib/kookit-extra-browser.min"; import { LocalFileManager } from "./localFile"; import localforage from "localforage"; @@ -208,12 +208,20 @@ class BackgroundUtil { return `official-background-${index}`; } - static getFeaturedThumbnailUrl(index: number): string { - return `https://storage.koodoreader.com/backgrounds/desktop-thumbnail/official-background-${index}.png`; + static getFeaturedThumbnailUrl(index: number, isAuthed: boolean): string { + const base = + getServerRegion() === "china" && isAuthed + ? "https://storage.koodoreader.cn" + : "https://storage.koodoreader.com"; + return `${base}/backgrounds/desktop-thumbnail/official-background-${index}.png`; } - static getFeaturedOriginalUrl(index: number): string { - return `https://storage.koodoreader.com/backgrounds/desktop/official-background-${index}.png`; + static getFeaturedOriginalUrl(index: number, isAuthed: boolean): string { + const base = + getServerRegion() === "china" && isAuthed + ? "https://storage.koodoreader.cn" + : "https://storage.koodoreader.com"; + return `${base}/backgrounds/desktop/official-background-${index}.png`; } /** @@ -222,11 +230,12 @@ class BackgroundUtil { */ static async downloadFeaturedBackground( index: number, + isAuthed: boolean, onProgress?: (progress: number) => void ): Promise { const id = this.getFeaturedBackgroundId(index); const extension = "png"; - const response = await fetch(this.getFeaturedOriginalUrl(index), { + const response = await fetch(this.getFeaturedOriginalUrl(index, isAuthed), { headers: { "Cache-Control": "no-transform", "Accept-Encoding": "identity", @@ -265,9 +274,8 @@ class BackgroundUtil { await this.saveImageBuffer(id, arrayBuffer, extension); const base64 = Buffer.from(arrayBuffer).toString("base64"); const dataUrl = `data:image/${extension};base64,${base64}`; - const { backgroundColor, textColor } = await this.analyzeImageColors( - dataUrl - ); + const { backgroundColor, textColor } = + await this.analyzeImageColors(dataUrl); this.saveImageMeta(id, { name: `${i18n.t("Official background")} ${index}`, extension, From 90e659f0188795f9a4f6e1ccc1727fd3793fe4a4 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Thu, 1 Oct 2026 14:38:14 +0800 Subject: [PATCH 21/42] feat: enhance featured image observer setup and manage pending elements --- .../settings/backgroundSetting/component.tsx | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/containers/settings/backgroundSetting/component.tsx b/src/containers/settings/backgroundSetting/component.tsx index 2f038d36..10f449de 100644 --- a/src/containers/settings/backgroundSetting/component.tsx +++ b/src/containers/settings/backgroundSetting/component.tsx @@ -19,6 +19,7 @@ class BackgroundSetting extends React.Component< > { fileInputRef = React.createRef(); featuredObserver: IntersectionObserver | null = null; + pendingFeaturedElements: HTMLDivElement[] = []; constructor(props: SettingInfoProps) { super(props); @@ -49,6 +50,7 @@ class BackgroundSetting extends React.Component< setupFeaturedObserver = () => { if (typeof IntersectionObserver === "undefined") return; + const root = document.querySelector(".setting-dialog-info"); this.featuredObserver = new IntersectionObserver( (entries) => { const newlyVisible: number[] = []; @@ -57,7 +59,8 @@ class BackgroundSetting extends React.Component< const index = Number( (entry.target as HTMLElement).dataset.featuredIndex ); - if (index && !this.state.visibleFeatured.has(index)) { + if (Number.isNaN(index)) return; + if (!this.state.visibleFeatured.has(index)) { newlyVisible.push(index); } }); @@ -70,8 +73,12 @@ class BackgroundSetting extends React.Component< })); } }, - { rootMargin: "300px 0px" } + { root, rootMargin: "120px 0px" } ); + this.pendingFeaturedElements.forEach((el) => + this.featuredObserver!.observe(el) + ); + this.pendingFeaturedElements = []; }; registerFeaturedItem = (index: number) => (el: HTMLDivElement | null) => { @@ -79,10 +86,8 @@ class BackgroundSetting extends React.Component< el.dataset.featuredIndex = String(index); if (this.featuredObserver) { this.featuredObserver.observe(el); - } else if (!this.state.visibleFeatured.has(index)) { - this.setState((prev) => ({ - visibleFeatured: new Set([...prev.visibleFeatured, index]), - })); + } else { + this.pendingFeaturedElements.push(el); } }; From 224913b7d37cc7ca9ff0ceea6abf4814a5ef2b66 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Thu, 1 Oct 2026 14:57:11 +0800 Subject: [PATCH 22/42] feat: streamline question sending logic and enhance textarea behavior --- .../popups/popupAssist/component.tsx | 54 +++++++++++-------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/src/components/popups/popupAssist/component.tsx b/src/components/popups/popupAssist/component.tsx index 5f7a5301..a3a59ed8 100644 --- a/src/components/popups/popupAssist/component.tsx +++ b/src/components/popups/popupAssist/component.tsx @@ -518,14 +518,13 @@ class PopupAssist extends React.Component {
)} - {item.role === "assistant" && - index === message.length - 1 && ( -
- {this.props.t( - "AI-generated content is for reference only. Please verify carefully as it does not constitute professional advice." - )} -
- )} + {item.role === "assistant" && index === message.length - 1 && ( +
+ {this.props.t( + "AI-generated content is for reference only. Please verify carefully as it does not constitute professional advice." + )} +
+ )}
); }); @@ -574,6 +573,19 @@ class PopupAssist extends React.Component { this.setState({ chatHistory: [] }); } }; + handleSendQuestion = () => { + if (this.state.answer || this.state.isWaiting) { + return; + } + this.handleNewQuestion(this.state.inputQuestion); + this.setState({ inputQuestion: "" }, () => { + const el = this.textareaRef.current; + if (el) { + el.style.height = "40px"; + el.style.overflowY = "hidden"; + } + }); + }; handleNewQuestion = (question: string) => { if (this.state.mode === "ask") { this.setState( @@ -897,6 +909,18 @@ class PopupAssist extends React.Component { marginRight: "10px", marginBottom: "0px", }} + onKeyDown={( + event: React.KeyboardEvent + ) => { + if ( + event.key === "Enter" && + (event.ctrlKey || event.metaKey) && + !(event.nativeEvent as any).isComposing + ) { + event.preventDefault(); + this.handleSendQuestion(); + } + }} onContextMenu={() => { handleContextMenu("trans-add-content-box"); }} @@ -914,19 +938,7 @@ class PopupAssist extends React.Component { />
{ - if (this.state.answer || this.state.isWaiting) { - return; - } - this.handleNewQuestion(this.state.inputQuestion); - this.setState({ inputQuestion: "" }, () => { - const el = this.textareaRef.current; - if (el) { - el.style.height = "40px"; - el.style.overflowY = "hidden"; - } - }); - }} + onClick={this.handleSendQuestion} > {this.props.t("Send")}
From 01aa348628e949e56f29bd679b432a2a6aa3187e Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Thu, 1 Oct 2026 15:11:10 +0800 Subject: [PATCH 23/42] feat: add confirmation dialog for importing books from URL and enhance localization strings --- src/assets/locales/en.json | 2 + src/assets/locales/zh-CN.json | 2 + src/components/bookCoverItem/component.tsx | 12 ++++-- src/components/importLocal/component.tsx | 44 +++++++++++++++++++++- 4 files changed, 54 insertions(+), 6 deletions(-) diff --git a/src/assets/locales/en.json b/src/assets/locales/en.json index a0470aa2..5a860f43 100644 --- a/src/assets/locales/en.json +++ b/src/assets/locales/en.json @@ -54,6 +54,8 @@ "Dictionary": "Dictionary", "Shadow": "Shadow", "Import failed": "Import failed", + "Do you want to download and import the book from this URL?": "Do you want to download and import the book from this URL?", + "Import cancelled": "Import cancelled", "New version available": "New version available", "New version": "New version", "Customize": "Customize", diff --git a/src/assets/locales/zh-CN.json b/src/assets/locales/zh-CN.json index a69476f7..f2c22401 100644 --- a/src/assets/locales/zh-CN.json +++ b/src/assets/locales/zh-CN.json @@ -471,6 +471,8 @@ "Highlight": "高亮", "Copying successful": "复制成功", "Copy ": "复制", + "Do you want to download and import the book from this URL?": "您是否要从此 URL 下载并导入图书?", + "Import cancelled": "导入已取消", "Text color": "文字颜色", "Eraser": "橡皮擦", "Eraser size": "橡皮擦大小", diff --git a/src/components/bookCoverItem/component.tsx b/src/components/bookCoverItem/component.tsx index 89d733d2..60cdd5f8 100644 --- a/src/components/bookCoverItem/component.tsx +++ b/src/components/bookCoverItem/component.tsx @@ -62,10 +62,14 @@ const BookCoverItem: React.FC = (props) => { const percentage = getPercentage(); - var htmlString = props.book.description; - var div = document.createElement("div"); - div.innerHTML = htmlString; - var textContent = div.textContent || div.innerText; + // Do NOT assign book-supplied HTML to innerHTML, even on a detached element, + // as that parses and fires inline event handlers (see CVE class in epubs). + // Use DOMParser instead, which never executes scripts or event handlers. + const textContent = props.book.description + ? new DOMParser() + .parseFromString(props.book.description, "text/html") + .documentElement.textContent.trim() + : ""; const actionProps = { left, top }; diff --git a/src/components/importLocal/component.tsx b/src/components/importLocal/component.tsx index 1fc3ab2c..8535b6e6 100644 --- a/src/components/importLocal/component.tsx +++ b/src/components/importLocal/component.tsx @@ -27,6 +27,7 @@ import { import DatabaseService from "../../utils/storage/databaseService"; import { BookHelper } from "../../assets/lib/kookit.min"; import { analyzeBookTitle } from "../../utils/request/reader"; +import i18n from "../../i18n"; // Convert supportedFormats to react-dropzone v14+ accept format // Key is MIME type, value is array of file extensions @@ -42,6 +43,24 @@ const supportedFormatsAccept = supportedFormats.reduce< }, {}); declare var window: any; let clickFilePath = ""; +const escapeHtml = (text: string) => + text + .replace(/&/g, "&") + .replace(//g, ">") + .replace(/"/g, """) + .replace(/'/g, "'"); +const vexConfirmWithMessage = (message: string) => { + return new Promise((resolve) => { + window.vex.dialog.buttons.YES.text = i18n.t("Confirm"); + window.vex.dialog.buttons.NO.text = i18n.t("Cancel"); + window.vex.dialog.confirm({ + unsafeMessage: message, + contentClassName: "custom-confirm-width", + callback: (value: any) => resolve(!!value), + }); + }); +}; // Comic 封面规则与 kookit comic-book.js 保持一致:取自然排序后的第一张图片 const COMIC_IMAGE_EXTS = [ ".jpg", @@ -64,6 +83,7 @@ const getComicImageExt = (name: string) => { class ImportLocal extends React.Component { resizeHandler: (() => void) | null = null; + importUrlHandler: ((config: any) => void) | null = null; constructor(props: ImportLocalProps) { super(props); @@ -98,11 +118,24 @@ class ImportLocal extends React.Component { false ); - ipcRenderer.on("import-url-from-link", (config: any) => { + this.importUrlHandler = async (config: any) => { const rawUrl = config?.url; if (!rawUrl || typeof rawUrl !== "string") return; + const confirmed = await vexConfirmWithMessage( + this.props.t( + "Do you want to download and import the book from this URL?" + ) + + "

" + + escapeHtml(rawUrl) + + "" + ); + if (!confirmed) { + toast.error(this.props.t("Import cancelled")); + return; + } this.handleURLImport(undefined as any, rawUrl); - }); + }; + ipcRenderer.on("import-url-from-link", this.importUrlHandler); } this.resizeHandler = throttle(() => { this.setState({ width: document.body.clientWidth }); @@ -111,6 +144,13 @@ class ImportLocal extends React.Component { this.props.handleImportBookFunc(this.getMd5WithBrowser); } componentWillUnmount() { + if (this.importUrlHandler) { + window.electronAPI.removeListener( + "import-url-from-link", + this.importUrlHandler + ); + this.importUrlHandler = null; + } if (this.resizeHandler) { window.removeEventListener("resize", this.resizeHandler); this.resizeHandler = null; From 32b1d3856c3742e07d6ca59c8909f5622f30f6c4 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Thu, 1 Oct 2026 15:14:52 +0800 Subject: [PATCH 24/42] feat: replace custom confirmation dialog with vexComfirmAsync for URL import --- src/components/importLocal/component.tsx | 21 ++++++--------------- 1 file changed, 6 insertions(+), 15 deletions(-) diff --git a/src/components/importLocal/component.tsx b/src/components/importLocal/component.tsx index 8535b6e6..faca335f 100644 --- a/src/components/importLocal/component.tsx +++ b/src/components/importLocal/component.tsx @@ -22,12 +22,12 @@ import { getTextRules, supportedFormats, throttle, + vexComfirmAsync, vexPromptAsync, } from "../../utils/common"; import DatabaseService from "../../utils/storage/databaseService"; import { BookHelper } from "../../assets/lib/kookit.min"; import { analyzeBookTitle } from "../../utils/request/reader"; -import i18n from "../../i18n"; // Convert supportedFormats to react-dropzone v14+ accept format // Key is MIME type, value is array of file extensions @@ -50,17 +50,6 @@ const escapeHtml = (text: string) => .replace(/>/g, ">") .replace(/"/g, """) .replace(/'/g, "'"); -const vexConfirmWithMessage = (message: string) => { - return new Promise((resolve) => { - window.vex.dialog.buttons.YES.text = i18n.t("Confirm"); - window.vex.dialog.buttons.NO.text = i18n.t("Cancel"); - window.vex.dialog.confirm({ - unsafeMessage: message, - contentClassName: "custom-confirm-width", - callback: (value: any) => resolve(!!value), - }); - }); -}; // Comic 封面规则与 kookit comic-book.js 保持一致:取自然排序后的第一张图片 const COMIC_IMAGE_EXTS = [ ".jpg", @@ -121,13 +110,15 @@ class ImportLocal extends React.Component { this.importUrlHandler = async (config: any) => { const rawUrl = config?.url; if (!rawUrl || typeof rawUrl !== "string") return; - const confirmed = await vexConfirmWithMessage( + const confirmed = await vexComfirmAsync( this.props.t( "Do you want to download and import the book from this URL?" ) + - "

" + + "
" + escapeHtml(rawUrl) + - "" + "
", + "Confirm", + "Cancel" ); if (!confirmed) { toast.error(this.props.t("Import cancelled")); From 32d20aefaac7dab608d60634d02533e52ebe8287 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Fri, 2 Oct 2026 11:31:29 +0800 Subject: [PATCH 25/42] Refactor content list component and utility function for improved readability - Updated the ContentList component to use a more descriptive class name for the chapter title span. - Modified the scrollContents utility function to target the new class name for better maintainability. --- src/assets/lib/kookit.min.js | 2 +- src/containers/lists/contentList/component.tsx | 4 +++- src/utils/common.ts | 4 +++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/assets/lib/kookit.min.js b/src/assets/lib/kookit.min.js index 78f3e8bf..7343e0e6 100644 --- a/src/assets/lib/kookit.min.js +++ b/src/assets/lib/kookit.min.js @@ -1 +1 @@ -import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.quickErase="no",this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.quickErase=config.quickErase||"no",this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),config.quickErase&&this.setQuickErase(config.quickErase),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),"yes"===this.quickErase)canvas.remove(obj);else if(this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setQuickErase(quickErase){this.quickErase=quickErase}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; +import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.quickErase="no",this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.quickErase=config.quickErase||"no",this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),config.quickErase&&this.setQuickErase(config.quickErase),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),"yes"===this.quickErase)canvas.remove(obj);else if(this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setQuickErase(quickErase){this.quickErase=quickErase}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),this.trigger("chapter-pages"),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getPages(){return this.chapterDocList.map((_item,index)=>index+1)}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterSizeCache=null,this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; diff --git a/src/containers/lists/contentList/component.tsx b/src/containers/lists/contentList/component.tsx index 86c92026..2a49aac7 100644 --- a/src/containers/lists/contentList/component.tsx +++ b/src/containers/lists/contentList/component.tsx @@ -312,7 +312,9 @@ class ContentList extends React.Component { className="book-content-name content-chapter-title" data-href={item.href} > - {item.label} + + {item.label} + diff --git a/src/utils/common.ts b/src/utils/common.ts index f3e618cb..3798dd48 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -502,7 +502,9 @@ export function throttle void>( export const scrollContents = (chapterTitle: string, chapterHref: string) => { let contentBody = document.getElementsByClassName("navigation-body")[0]; if (!contentBody) return; - let contentList = contentBody.getElementsByClassName("book-content-name"); + let contentList = contentBody.getElementsByClassName( + "book-content-title-label" + ); let targetContent = Array.from(contentList).filter((item) => { item.setAttribute("style", ""); let dataHref = (item as any).getAttribute("data-href"); From b38e2c143c96dad47592cb3f1386df365c9855b1 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Fri, 2 Oct 2026 11:57:37 +0800 Subject: [PATCH 26/42] fix: enhance scroll handling in reading aid mode - Added a condition to prevent default scroll behavior during reading aid mode when in scroll reader mode. - Ensured that preventDefault is called before lock checks to avoid animation frame drops caused by native scrolling. --- src/assets/lib/kookit.min.js | 2 +- src/utils/reader/mouseEvent.ts | 13 +++++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/assets/lib/kookit.min.js b/src/assets/lib/kookit.min.js index 7343e0e6..fb5e73e2 100644 --- a/src/assets/lib/kookit.min.js +++ b/src/assets/lib/kookit.min.js @@ -1 +1 @@ -import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if("IMG"===target.tagName||"image"===target.tagName){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.quickErase="no",this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.quickErase=config.quickErase||"no",this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),config.quickErase&&this.setQuickErase(config.quickErase),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),"yes"===this.quickErase)canvas.remove(obj);else if(this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setQuickErase(quickErase){this.quickErase=quickErase}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),this.trigger("chapter-pages"),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getPages(){return this.chapterDocList.map((_item,index)=>index+1)}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterSizeCache=null,this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; +import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("FQBhc20BAAAAAUULYAF/AX9gAn9/AIEABYAACwIDf4IABwEBgAARAQaAAAuDAA6BABUDAGAAgAADgAANAQSBABUDAGAHgwAegAAfEgNCQQcABAEABAgIAAIABQIKAIAAB4EAAwEFgQAHAgICgQAHEAEDAAUGAAMDBQQJBAQJAQaAAAEeAAIEAwIEAgIBBAcDAwQFAXABDQ0FBgEBggKCAgYIgACYIkHQ1QQLB4oEHAZtZW1vcnkCAAxpbmZsYXRlOV9uZXcABw2GAA8HaW5pdAAIEYoAEAdfcmF3AAoQhgAUCXByb2Nlc3MAC4cARgZlbmQADhaGAA8QbGFzdF9jb25zdW1lZAARC4QAGYMAbYUANoMAbAEShQBYhwBrARSFAH+DABMHZ3ppcAAVD4UAFIUAfgEWhgBWgQB9AhgVhQAOjQB8AmRliQB8hQAOggB8AhoQiQAPggB8AhsRigATggB8AhwPhQAUhQB8AR2GAFaBAHwJHwRmcmVlAAIVhQAVjACDCgZtYWxsb2MAAQuCAFUKaWFsaXplAAAZX4AADxZkaXJlY3RfZnVuY3Rpb25fdGFibGUBgAAcG2Vtc2NyaXB0ZW5fc3RhY2tfcmVzdG9yZQAFHI4AGwJnZYAAbw51cnJlbnQABiJfX2N4YYAAWwRjcmVtgAASBl9leGNlcIIAXQZyZWZjb3WAACUtPQkSAQBBAQsMACEiDA8XGR4+NTg7CqHlAkECAAu/JwELfyMAQRBrIgokAAJAjwACEiAAQfQBTQRAQaQnKAIAIgNBEIAAEgYLakH4A3GBAAkQSRsiBkEDdiIAdiIBQQNxBIEAMgYBQX9zQQGAAB8GaiICQQN0gAAZDMwnaiIAIAEoAtQnIoAABgQIIgVGggBSCSADQX4gAndxNoACphEBCyAFIAA2AgwgACAFNgIIC4AASAMIaiGAADcBIIIARoAABQRyNgIEgQAPA2oiAYEATQMEQQGBABIHDAsLIAZBrIIAnwMITQ2AABuBAIYEQQIgAIEANQUAIAJrcoAANQQAdHFogQCjA3QiAIIAj4AAH4IAj4AABosAjwUBd3EiA4YAkQECgQCRAQKEAJEBAIAAaIMAhYAACgJqIoAAjIIA3wUgBmsiBYMAjIAAGQIBaoEALgoAIAgEQCAIQXhxgQBuBCEBQbiBAKAEIQICf4AAZQEBgAAZBwN2dCIHcUWEAHgCIAeAAD6AADyBAHWBASEDCyEDgQDpgAB2gAAchACEAQGDAAeAAJyBAIuCARyAAFYCIASAADmAAP6CAHWAAQsCQaiCAQkCC0WAAQkFC2hBAnSAAOYDKSICgQEuAnhxgACqByEEIAIhAQOCAagFKAIQIgCAAIOBAAoBFIAACgENgAB+gAEQhAAqgADZgQFuBQRJIgEbgAA2gAFJASCAAAmAATgBIYEApwILIIAAVAMYIQmAABaAAAkEDCIAR4AASIAACgEIgAA3hAHGgACxAwgMCoIAKQUUIgEEf4AByAIUaoABU4EAdwMBRQ2AANkOQRBqCyEFA0AgBSEHIAGAAZoDFGohgAIFggAwAg0AgADlARCEABCAADEGDQALIAdBgABbCAAMCQtBfyEGgAAfA79/S4IAJwELgAISgAC1AiEGhAD+CAdFDQBBHyEIgAH+ggDygALEA///B4ACxoABwQEmgQJYBnZnIgBrdoICpQpBAXRrQT5qIQgLhALxAQiFATUBAYEBngIAIYECCoEAB4AAPAEZgAAdAwF2a4AAVwgIQR9HG3QhAoUBSYUBNAQDIARPgACTAQGAALcDAyIEgACGAQCAAH8BAYAARAEDgQI/ggFoAQOAAdOBAtQGHXZBBHFqggDcAkYbgAAdAgMbgABkAQKAAI+AAWSBAO6BADECBXKDAIQBBYACzwEIgQK7gADugALPAgdxgQGuAwMgAIUB4QEhgAEdggHAgAFMiAHCAQKAAb4BIYAAbIEByYMBxAEFgQAJhQFTgAGTAQGDAW8DCyIAggByAQWAATkCIASDA02AAEGBAMsBBYEB5wEIgAA5gAAJhAHngAAKjQHngAKTgAAWgwHnAQWCAeeAAA+EAecBBYIB54ABK4ACeoAA+4MB54IDgIgB54IAEIQB5wEDgwHnAQeHA9gBBYEEgoMDQ4AEpoAAjYECnwNBEE+AAI2CA4uAATKGA4ECBWqBAJOAAFeFA66BA1WAABeGA7sBBYsEQIABX4AEJwEhgAHlgANGgQA6gQNWgAN0gQCZgQNlgAJvgABKAbCCAIgCAkmAAIgBsIAAH4IAgYEALAK8J4AAA4EAG4MAiIEAN4kAjYYEMYUAS4QCSgEvgAQ/BQJ/QfwqgAA7gABTAoQrgAAIgQJoBYgrQn83gABXBoArQoCggIAAAQEEgQAOEfwqIApBDGpBcHFB2KrVqgVzgQB6ApArggEnA0HgKoMACAaAIAsiAWqABaKAAZMBa4AEXIEEmQVNDQhB3IEAZAIiBYAAZgHUggAKAQiABKMFIgkgCE2AAUcFCUlyDQmAAvmAAEUDLQAAgAKQgAJvhQX6hADYgQA5BOQqIQCDAlqBAD+BAY2AADwBCIICagNqSQ2BAtuBAhKCAkMEQQAQBIAFdwJ/RoAB+QMBIQOAAMmCAR0BQYAAk4AD+4AGIYEC/AFrgQVTAWqCAs0DcWohgABAAQOBAKsBA4QAq4EBEYMAq4ADRQNqIgeAAHGAAUoBB4AAqwEEgAAqgABfgAFjBUcNAQwFgQA4gABMgADrgQAWggJCgABTgQCVAUaABP4BAoIDFYEAioABCQVBMGogA4EAuIAB7QMMBAuDAXGBAyADIANrgQCJBwJrcSICEASDAC6ABWWAAJaCACuAAJyAAM0ERw0CC4EBaAHggQCWAkEEgQWsgAWohADpggDygQBoAXKBBSQDTXINgANTgABQgAPoCAZBKGpNDQULgADOgwDRgQDPggGsAdiCAA4BAIECTgLYKoEDSQEAgQGFgwFxAQSHAXGDANOBA2uAANUCIgWAANeCABKDAWuBAMcBtIMCe4EBSoAAewEbgQQtAbSDAr2CAmkDQegqgQYwAQCAAFCCABUFQcQnQX+BAAgCyCeDAnuBAAwB8IMCQIEB4IMGz4MHsIAGUAHUgAMQgQZYAtgngQUngAC7A0EgR4AAeYEDAQQDQShrgAAQAXiAAOkBQYECa4AB3oMDDoQHoIIGzoADdIUDCAQCakEogQNsBMAnQYyBAXuBA+CAAc6AAYEBTYEGZAJLcoMA2gQMQQhxgQAKgAHZAgVqgQAwgABRgATNAiAEggBmgAhRggN0ArAngwOPgQFPgAAtgACJgwBvgAClggBvgABWkABvAQOCARMCDAaDAAeFAT0DIAJLiAE1gwH7AQWCAYACAkCBBpmEAYKBBPeEAXoDAQwCgQWcAi0AgQCtgATgAQuEAa6BCSyDAa4BBIECaYEHPIICjAMiBUmEB1kBCIIGTJQBQAEHkAFAAQeZAUCAAGICBUGAB/iBAEEDakEvgABPgAAoAQSABUyACZQDAUEbggksCUHsKikCADcCEIAACwHkgwALAQiAABSCCVuBAHCNAiCEAgyAACABGIAEr4ICE4AAmIMEv4AABQEEgQmQgADPgQL+AyAERoEG6YMFSQF+gAnDAQSDCC+ABnaEALaCCMEBAIAI8gMCQf+BCkOAAAiECQ+AABWEClCABSqBCd+ACQ0BAoUJDYAAEYIJDYIJgoEBNgELgAbDgADagQkNgABggAZ1AkEMgAWyAQiBBS8BH4IHMwH/hAfdAQKAB92AABmQB92AALGAAMUGNgIcIARCggEPAQCABzkDQdQpgAmaggTrgwg3gAKvgQo1AQOCAIoBqIEJlwEFgwmXggllgQCPAQKACAOAAFWCCAOACGKBCAOCB9aAB6KBAi2BCt2CB3wBAoIDqoAH44EHbIEH04MDDoAH8AIiA4EG5wEFggbngQBXARCBAJqAAe8DGEEIgAcEAgQigAgsAkEMhQoHgAHTgQDwgwCBAQiDAMOACNWAACMBGIABAgEMgAA7hAbsgQLygwRHhAapgAZkAU2ACH6AAmqBB8ixBquAAyEEoCdBMIEAOYEDMIIIwIMHFoIC14ADKIIDa4UCwwFqgAYZhQBCgAmMgAaDggAVgAUFAiAIgAbsA2shB4UE4QIgA4ELboED2YoDzAEHgwUbgQDlhAvYgAHgggfzgwAxhwrrhAifjgAxgQIlgwEGgQFAgAFogQWXBANxQQGAAD+AACSACiABCYEAFoACPYIM14MClIAAEYEIzAECgwwCgwKWgAwGgAA5AXaDDJgBAoEC7IcLg4ECd4EANQMYIQaAAEaABC+BBBqCAEWCAR+BACaBAaWAACaAAB+AABiAC1iACRMBA4IJE4IB+4EJp4AAEIEJE4ALh4IKKoAGiYEJE4IEMIAAMIADV4ELGoEJuYIAMYECLAEFgwkTggqKgACSAQaACaiDAGABHIAA5AECgAW2gQoGggEpgAF+gALYgwGrAwINAYACyIMC3oEA1YUA0oEAOwIgBoAAXYEAMAEGgQAsARCBANeCAAoBFIAC5oIMCoAI5IACl4QAtYEDXoEA2YADOoEAJQEYggEEggw0gQJFgAAZARSGABkEByAJaoALzwEDgAAHgQLtAQSBA32AB02GBCSFBNWAAAoCaiCBBPaAABKDAYwBB5MEIAEHrQQggwMpgQAHhAGxgAQoAQKBAGaEBCgBB4AEKAEHkgQogAFbgALUiAQogA8mgwQogg8dhAQoggS1A3QiBYUEKIAD24MAkoYEKAEHgAQogAUHggQoAQKEDCuCBh6DAfSBDnaCBCgBB4EEKIEMC4EB7YML+4EFfYEEKIMLQIIB/IYEKIAA1gEYgAAHhADkgQDyhQEEgQZ2gwuPgwQqgQIvgQAriAEIAQuADLWCA9qCAgABCIMCQoAAZgEcgADQgADOgAJsgAJCgQ8KgACKgQJCggNdgAbvgQDiAQeEDxmBAa+DAECACgCEAkCACgiEAkCCAAqAAkCEDkoCIAiBAISDAMiCC6mAAIaABomCAMaFDC+BAkCCABkBFIUAGYAAXAMEQQ+DCmMBBIEEqYADi4cLuYMEfYYEIYEMCoQAH4AACoEEb4QAHIEFXQFqggGPgAASgwJegQFxkAJeAQSiAl6BD3aAAByAAAcBDIECzYMAB4cCXoIAZoQCXgEEgAJeAQSVBoaCADwDHCADkQaGgQMaghC1hQJYgAK0hAaAgQelgwBxARiBAJgBBJYGh4MCX4UP74AHo4QGh4IJHYEAJoEF8oECXwEHhw9VgQBeARCDEGiBA9iFAOWBAPOCBvSDBN2CABaDEH+DDaGABBuDBPKCANSBDgGDAl+CBPoBCYMCX4AAPIQCX4AB74ACX4EFZ4AAKI0CXwELgwJfhgJdAwIgCYQCXQEJhgJdggAKiAJdAQmBAIKDEEyPAl2DEHOZAl2BC/uKAl2ACXaNAl2ABQKEAB+AAAqAA5KGAl2AAm6EAl2KEeaBDjqCAYWAAmGGEeQBIIMIT4gR5ogCW4ABO4ICRoMB3IEH6YICW4IB8QEIgQb/ghHXgQ6ZgQBugQiAgQFjAQuADg4DEGokgABKBgveCwEIf4EGz4IA7AJBCIEMd4AJqAFrgwLeAXiBCzQCIQWCE5QCAXGBCa8BQYACXYEGgIEFv4AAIoAAL4MLB4AKo4ISvIME6IAE6oQHeoQG3oAHNIAAPIQJxoMG7wEEgA0ViQcygBMMhAcygQ2YggchigcfiwdFgQ3KhRAwiAcdghAwgwcdAQSAAsoBBIISF4IHHYABhIUQMIIHHYIAEIsSF4AIo4ACZoAJQ4EH9QIDR4AOUIABOIICZ4AQ9oQGf4EBHoMBxIIUbQIAD4QF8YEAmYIFUIAN6Y4HYoICwQEEhwdiAQSWB2KJAsWrB2KBAsWCARyBAsWIB2KCAsWCABmBAsWFA6MBBYQRmoEA7QEBgAHShhW7gwHigglggQHAghTZgAlrggvlhglrgA1IggEXhwENAQODAfACRw2BEXGDEE8BuIMACAEPhAmFgQ/4hAmHggBNhgmHjwBNgQ2YhQFdgQKEgAAjgQw3iwJGghJEgAF7jAl4igJGiwGagAIzghKMgQJXAQWIEoeJAleDAgOREoeAADS0AleAAg2RAkCGAOaDDlmHAjOHB1ODAjOCB1OjAjOABsSjAjOGB1WMAjOHB1WOAjOOALiAABQBCIAPz4UDJYABrYULFIELLIMWt4YHKoAE+oILFIAUhIUEz4AG9I0WtYQGq4AICIUGRYIE1oMGIYACSoEJh4AAZYQHKQEAgAcpgASzgAcpAQGDBymAAsyGCYeCBlyGBymGCYeAEzWAAucBf4sJiYMXSIIJiYMFYoABqIECpIENJYMJIpEJj4ABnoAVnYECD4YNtwEAhgmPgQzagxWKgAG7hgcwgBXRhQcwgQBdgAu9gAfpgQD3AgMihgEGgALVggD8gwEKgAAngADjgRRhAQuAAnWBEF6DBjiEARqCAY2CD/qAEZoBxIICEoAFlIASTQIgAIAPwYATTwSMCwEHgAANgQWagAXHgxBjgRJ3ggXOgAEWggXOghB3gACOhAhIgQAmgRKBhAaPhBC7AQyABm2FD4mAAZGRBcOBD4mGA32AACKBA2yEBgSCADCCB/6BAc+BGJmBA5CCDLABBIADbIEV04QWVgEEghaZiBXzAQeAAWGBBeOAATCCBNKAAUWCBeODABCFAVWLBcOAAIqHBcOCDuKAFD2EA4OBBsaFBcOBABuCBcOEAJmHBcOAAEqEA5CAAJYBHIAAUYYDkAEAhwOQgwlXiwOQhBqPggOQgA8VhgOQgQH1gwOQgAAKgAOQAQOCA5CABeWBA5CCAPoBAoIBWoEDuIMJKIADd4IBIYADuoEB8YEDx4UAGYYFr4QA7pEFtIIFhoYFtIATf4QW1oYPsqkFtIIAH4YFtJAATYEauIQBToERp4ICTYMFtIcCN4QFtIIPj5UCN4sBi4cFtIAGtIYFtIsCSIUFtIECSIgFtIACSIUFtK8CSIIFtI8CMYYA5oMFtIcCJIIFtIgCJIgFtJ0CJIkFtJoCJIIA1pACJIIA/ZACJJEAuIENVYQFtIQBrYUHUIEHaYIFtIAcY4YdrIEVzIEFtIAII4UM3oEK0IAEHoUL2YEM3oMQsoUKfIQQx4MKmIIFtIAErIYFtAEBhhtAAQKDBbSBBSeCBbSCEiGAALkDHCAAgwW0AQOFBbSAEW+GDzuBBkiAFmWGBbKAEAWDAJGEDBCCBq+CBUuABbOAAMGCBbMBA4MFs4ABH4EFs4ICDoEBqIIFswEBgQWzAQOBBbOBAAeABbOAAnqAAJWGBbMBAoMFs4QQu4AClYIBWYQA6oMGl4EGCoYa0IMTZIADXYIM4oQTgIMBDQMLC0mBBxEBkIMGe4EVGwFqgQtiAQKCCzWAAHSCA1CCF4UDIAA/gAUCAXSAHo2HE0UBf4ABTAGQhAqQAwELBoAALQYkAAsEACOAE7MCAQGABtUEQcQAEIAQGYMLyAIEa4EZj4AMOoIADoAGHgMA/AuBGM6CBWuAASMBJIEHjQU2AiAgAIASGQMLCxGAACaBAVEBfoIHxQsQEAkL2QIBA39BeoAHMARAQZQIgQBNATGBAjgBfoEcBYQAVYQEuAEggwJ8gAAKASSEAAgKKEEBQdg3IAIRA4AGVoEAVwF8gQBXgweQgADmAzYCOIUBrwQCQb/+gAAJgABlBCAAECODFg8GQR91IgNzgBlXgQKAgBQFgBYugwLSASiDDnwCdkGCGfoEAUEAToAeWYEfa4ABYIIAPYIAXAM0IAKBAj8BLIkAFIAA54EAB4ABloEAG4AI1YIN8YAAX4ADhgEwgALIgQAWATyDACsBJIAAB4AbNYIOHAFCgRtAAXCCCD8BQoAAqAE3gQ3IAkKBgwAUAcyAAOCAACsCtAqCCr4BcIMA0QFUgwAHAlBBggkNgAEJgxmBAyQRAYQBMQEcgAIsjAFtAXCAAW0BEoIB+oEA5oIXlAgEEA0L/SQBIoQhWQIUJIEBeAEZhgEkgQeMAiIShAFsAwQhE4QbV4ECNwETgARnAwAhE4IAfYEEkAHcgAs6AR+AAKcF9AVqIRWAAAgB2IAAEAEbgAAIAfCAAAgBGoMAvwIhFoEAIIAAEAMRQZyBGBkEIRxBmIIACAQdQZQrgAH4AiEegQM2A0AhCoEABwE8gQr5AUGAGDIIAkkhIEF9IQ2AAA4GBkchISATgQIYgQMvAxchEIEY+JEiCpIAAoEJjpEiNoEQgoAiGoABdxdrDhMEBQYHCAkDAgwNARkAGw8iIhQhIoIEfwVMIQYMGYYACoAW0IAACgFsgR5MgQAIASKAC9YDKAJggh8wAwxJG4AAIQQGCyAggR/agABWgAZSBA4hDQyAAZGBBMYCDQ+ADxICCHKAFeABCIEEAIIXjQMKQQKCBrQDRQ0OgRqIAWuBH5KAARADIAp0gBR4gRSggBrSgAAtAwkhCoMgzoERfoACUAMIQcGAAF6AAtKGAMuAABgBdoIWRwZrDgMAAQKABOgBHoENdIIfmAUIA0BBkIAKBoAP7QGQghokARGBICIFdGpBCDuAAjSAAAuAIFiBAF+AACcCgAKAH0YBBIAAB4MAJ4AFCYAAJwEJgQAngAALgArZhAAnApgCggBOAZiEACeDAE4BB40AToAANAGgigBJggBwhwBJgSB3gAIIA0GgK4EEewKgPIMACQMgFEGAETYBDIAFgwERgAA/gAAXgAARBwxqIBUQJBqCAFMBIIkAUgEFjABSAZyAAE4BPIECqgEcgwBKgBCZAQyAIJYDEUEgigBJgAJ2A0EBOoAEcASgKyEdgQFXAR2AA1GAA3gBiYADeAHQgAOEAViAABOAAEKAA2sCQceCBDwCQQGAAqMBIYAKNAQKQQNrgAKngRXuAiEHgQAdgQg2gSB6gAERgQHsBB8LQcSBAZuDC9ECwguBGTQB0YEAEYIcR4AASoERF4gAQ4UAPQIMGoEAGYAX/gEFgAYIAQqAGJaAAByBGa0CQR+CE66CB+mAAh+AAXaBAh8BBYQCH4MBboMS1AMFDAKABWeAAVKBAhsBBoAAVAEKggCRAR2ABZOBCHID//8DgB6CgAAJgCT3AhB2ggsuAkHdgxKfgQChggqqgAJmBBoLQcKCAEABAoEACIMSVoAE/gFEgABagAi2gABUgQOMgAQWgQBbgACzAwJBw4IAJoIC4gNEIgOCCDmCFNiAG+ACAyCBE7EBEIEACoECiYAAKoQDEYAAOQESgBWIAwMQJYMjmQFEgAWJgABkgAAtBBJqIRKBADYCayGBADuAANaBGlCAAA4CBAyBEzCEBckCDBeACNOCAz0CDUuADFmNAR2FAzyEAR2AA3QBaoMDP4IBHoEBnoMAhoEAUoABEAEfgAEXA0GBAoAaKQFkggAQAgV2gAATgAA7AzYCaIIAEAUKdkEPcYAcVQEigAkgAWCAAE4BDoMBvQEOggG9AkEegiHeAkGhigFKgAChgAAMAcWDAjoCACGABCOBBZgBbIADE4ADqgMGIAyBCpsBE4AACQcGQRNNGyEJgADLAwYgCYIN1oAAE4EhHoAALYAC44AADAV0LwGwDoIC6gEAgQLqAQOABGABAIEHZJgESQEKowRJgANhgBrygwBpgAAMhgBpgADbAgdxgQBsiwKnAQSAAMaFAquDAEEBFoMGi4AAB4AGmYEdgYEDNYAADoAGmYADcAUTIBogG4EDbAIiDoIBIQG/ghdnhgEhARaBASEBxoQCYYIBHYABKAEOgQ6AggJKA2QiD4EABwRoaiEMgADcAQuABVqAATKAHaMEKAJYdIACwQEhghVUA1AhIoABAQEJgACbgAOXggEFASKAAzwCGHGACdIHaiIjLQABIoADBoAfOIEK4YEWDoABFYABAYkDPwEJgQEVAQmFAz+AANeAAZ8GIy8BAiIIhRV/gAj3hgEmgAAMgAEfggTEgSPbgQEcAiAGgwEcAQuBFlABf4UGaIACegQQaw4CgAWHgSOUgAl6gg/AhgCMgBAwoQCMigBlAwUgC4IJsgJBh4sDswEJgAGTAQOAAvmAJpuBBmeAAgaBADOAJYmBAJiAJE2ADqCBJp2BALsDIBFqgAAeAi8Bgg7AgBYzjQCXARuoAJeEAhuAAJqACyyDAiCAAjaAAFSCDFiACnOMAFwBGqkAXAEHiABcAQeDAFwD/wBxgCc/gCeGgQIiAwQgDIAAKQILaoACFJYBEYAD3YEFPoIGKoMBuAEEgQG4gQHPgAJigwMhhALIgAWjAWyAF7mEADiCABQELwH0BIMBbwKUCooCtwEVgQK3gABxhQLrhAMAgQasAiAPjALyAaOLAvKCADuABEMBXIME8wFwgAM+gQaZggLuggChgQLwgABDAR+IAEMB8Y0AQ4QGcYYGloADNIQFkYAACwENgwBkAciFBZGBA1cC0DeJAzeCA1UBUIADyosDNwEMgAFugATjgQM3AQuLAzeBJuahAbgBC4ADNQIhD4AC+oAAQIAp14ELUwX/AXFBDoEARwMGIQyAAJ0BBoECGgMMIA+BAGYCIRiAAJUBBoABwoIAlYIBqQIgGIAAhAELgCgPAXaCAIcBD4EAhwEMgBjPgQHkgACIgAR8pwMzgQdCggOYgABGAQCAAe4BD4IAnYEB6wEPgQZlgAVkAiAMgAXeAtA3gAAvAQyDAmwBDIEALwELgQC0gA/SgQP5AkHNgwFzARGBGscBIIEmEYUGfYAACYAknQLQN4MAGwLAAIEAHAMAQdWBB+mHAaqAABwDAkHJhQdAgBnNAXGBBj4BTIUCZoIP0oAGoYoBhoAAvIQA7oAIUqIA7oICSYAAxwEGgwDOhAdLgAfiAiAGgQFagA5dAQyBAPGLBK2FAumAKDABEIMKHwEQgQDthAcUARKBB5qBAEeACR2GAkwCIBCBAI8DECASgQCCAhIMgh3lggebAQqBHJiAAdABCoIHWoAFz4QARoYAIoIAGIAHCIQAGIITBYUAGIIAEgEOlABMgAE8hAA0AQ2AAk6AAAeBC3cCQdCDAI+GCSGDCTIBCoQrvwJEIYIik5IAUIAAyYQAUIAA+AMCQcqFAZuAASEC1DeAK6mBAEABXIMCj4EACwFUkgMkAQuDAySCAp2HAySAB2miAa6CAoeBBmKBApcCIg+DKhiCAcGCB5SAAGIBC4gDHQEPgwMdAQ+GAx0BD4YDHYIDpIgDHaUCL4sDHYUCO4ACGoEDtYAEHIIDxYAAiAEhgAzCgQMlAQqFAyWJAj8BD4YC8wHxigLzhgJYgCsQAwJBy4UBYAEPhgL7ggVpAUiHAwKIAV8DIAYEgybGhQMBgRnrtQMBAUiJAwGBAHKSAv+BAKUBzIQFKYYDB4AAEYQCJQEGgAfOggBNgArEAhcggA8fAQmAAe2CGy4BCYEcvIAAGgEwgCS5gQAIAsw3gxCpAfyLBikBB4QAQQE0gCrEAQOBANaAAAyAEJEBKIAQM4MARAFrggcrggAWgAAiAWuBBtyBE1qBC0WBFIcDBkkbgQAgARKBCvyCLo2AABeBHYmBAZiHC1cBCYILNgMJIQOAAT4DEiAFgAEtgQO3gwOngQblgQf7gQFKAiIDgRJgARCAAHmAA8aBAE2AAWKFA92BFP6SAzOAAcSEAQ6BDLSFABuJA9mAA0aEACKACFKIB0GIBA6BABaEDIqBEZ4BEIMS4QEShiIFgRQ2gAblgRF9gAFBgQlygApJATyHD58BLIABXQQQIBdGgAhVgAP9gCmBgRG8gBgSgSYJgAARgCsIhBCHgBVdATiDBbyCGDeAEh6BFXACKHSBGhKAEj+BEiaAAG8COCCBFbGCHLUDLCIFggAugRGXATCCMO+CADCBKiICLAuDAfWAALuBA6QBBIEBXANrIAWADK6CIFMBNIMemQEsgBHXgwRwgAANgAHoAWqBDNSAACeBAd+AASWBASkGSSIJGyIEgAA4AQmBAGqBAeyBDPeAKH0DBGsggQAXghaAjABPggANATSAIhiACoWAARyDAKsCCUeAGWmAACmAAniAAJYBCYEdWIENZ4EpH4ASW4IRpAIIIIIRpAEEgABcgAAWgRrdAReDES2AEuSCLQUBFIAAF4EVt4ABVgEgggA6gBKxghF2gAPSgRpygABDBBtqQYCAEdyDERiCEMIBRoEAE4ASrYIUOIEOEoEwBYEIfoAAGYABKQcgDUF7IA0bginVAQ2AAJMBF4AAHwENgACZAROAAAiAAagERhshGYMokQHSgwiwAnwhgBFJARSDIBcGGQuUCQEMgBQrhhKngAEhgAjQgAAHgBMngAM0gANCAQ6CB40BEIIatwMCQUCAAY6HJ++CC3OAM+kBAoEz6YEozoEz6IAEwAEOgSBggCGaAQSABWSABh4BDYEFcoEUpYAASgELgADJgSBEAQuADc8CIA2BC+IBCYAEEwQNIAtrgy1rgAmIAU2BLUWCF5sDCSANgAx/gQjUgwArgQAngAGUARCBAEEBCYAAFQEPgBFgAnJBgSOIgAT9gAjNgCFFgCFNggAPAwwgDIYho4AEeQMIEAOBI4GDGTmCDf2DGS4DDWoigABVgABykwBQAQiDAHOEJoqBKSaFK36BAzKBAFKDIP+CAFKDGTOAAFIFCCALSQ2BKDyAAAmBAD2CBmeSAGABDYYm5YACU4EAOYIm5wEIgSUzhCssgyLSgQA5AiAIhQA7ggAsAgcggBa3hzCagRAagAeogBnCAQ2EIgmCJYOBBtWBAYiAMqwBcYABNYEigoEAooALkoEBRIAABwFrgASngAAiAwwhCoINNYMYJIAAEQEIgABhAQqMGcCBIqmGKOyAAB+BBEOABdaEI/+AADUBGIEUFYAAEwEMgRDchQBFigAmgAAfgAAYAxQiB4AWoQEMghnEgAAPARCBM4gBAYAAEIEZxAENgAVJAQ2ABLMDByIKgRnEgAEiggAwgANvgSLMgAAQAQqCADGBBU6AA56EAYaAERaBBkWCGaOAAFEBHIEA8IAYPYIZo4EBnIABZ4EZo4AAjIAAR4sZowEIiBmjAwwgEIQZowEQgQAsghmjggAKgBmjAQqCGaMBCoEFQAEYhAC1gAAoggDZARCDAQ2AEM2DANyBBo+CABkBFIYAGQESgw7OhAHKARGHAgUBEYsByoMB75ICigEShALajgA0gAIQAhIQggX/gAf5AgcLggCYgCi2gQbegQRJgBgtgSVlAxpBfIArbgEOhCPzgBBTAnEbgilIgQBMgRD2AwdLG4IAOgYJIA4gB/yAOmaAA8cBEIADFwILIoEEAocX2wE8gAAHAQ6ABceABA6AAC6ADPwCIAKDAC6CBk2BBluDF6qBACyBBluBBFODGbKACAYBEYEk9YEAHIIFKIAHO4EF24EFI4AMrYAaOYEf2gUYdHILCIEE6gUFEBALS4AZSIEXDgQEf0F+gh43gCExgQZmgQB7jRd4gAAdgDOcgwAXggZyiBePgRj8AR2JF48DIAERgAengQCcgADkBQAQAgsQhAAehBfSAUCMF74FDxATC9KBGSuHJUObGRiBCQyhGRgBtIcZGAEmgQ5DgC0QgAEFgApqgAYFA0giBIATuANBD0uCGwwDQYH+gAVDAXKIGSaCGR6CGSgBIIEAKYMZIYAARo4ZIYYAFI4ZIYAZXZ0ZJIEbaYsZJIAAtIoZJAHEtBkkAkF+jAFmAXGAAWaLABIBH4AAEowZNgEGgBk2BIBEASOEGTYBEIIZNgEXhQFCgxk2AQyEAYqEGS+BAm2GCKeCB1oBA4IHWoIOVAHAgwcYgAAHgRybgRj2AiEdgAAXgRlTgBkTghlTgAe0khlTgRlrghlTgxk7gBAWgxk7gggFARyFGSsDDiESiRjzgRSCgBlTgiGmpRknwwACgAHmgAG7A2sOH4IZZxszNDU2CgsMDQ4PEBEDAhQVASQAJhcYBD4/QEGEGWoDCwwkhgAKgSRZgBlsgw5aghl2ghopgxl2AQqBB/aBDkmAABIBDIAMGQEygwAKghZ0hgFiAgwzgRBnAQaDBQmACgQBN4oWMgEGixYyAQaBDGKBELGBEP+AIPWABKsEn5YCR4E45oEAWwEogwBZgBBNASiBBf2ABMKAHPyAAAICECeBAwcBHIAPLoAALgI7AYEpLwEQgABKBEECECeCIJ8BtYgXUIAEFYAAYgEzggCrASSBNr6AAlyAEFeAAwSABT0DdEGAgANugi39BWpBH3BFggMhggjBAwBBuYsMaIAAQgEHgRafAQiDF9EBh4AO0I0AHgIEdoEDxwNxIgmCDTiADUYCB02CAMYCIgqABwcBCoAMXYEpvgIoIIAhFgQFT3ENgBaXgAWmgjq4Aa6LDeEBA4AUYwEyiwFGATakAUaCC9aABpCCEhWTAKuAAbYEB0GAwIE9nYAAHQHYixL5gwHTASSEGF+BARiCBDKBNo+BADaAOBGBBGSBNOyDAAuAAXcDOgAIgAc+gQArAjoAhDv/gQGagwGPgh0kAwJBtoUTRYEIwAEGgwDbgxlvA0UNNaUA24gAmIEOToEMtwMtABWCJPSLAJSCCIaKAIoBBIYAigG3kACKhQFlgAwMrgCKgAD3gyK8ggFzgSAWmQCYgQKskwEiAbiLAJiBACSAPBsDQYAIgQGnAQeCERmFAKmBAASLAKiABLyAL4CKAKiDGqKCFq4BNoIamIICfYATlIEAvIENJYAP34EI8YIDV4AAaIEAo4AFvIUArgEogACugBvykQCuAgwohQECgQAngg2oARCAABSKAdQBMqcCr4AICoECWoADh4ADj4A8y4ECc4QDlQQYdnJygwPpgghuATCAAScBvo8BJ4EQVYMIrYEIloAC7I8O8YARF4UO8QRBAiEXgAEShgRKASiMAGGDFHsDCyAdgB8UAg0vhB5PgRohjBoGgBhuhBoGAQ+KGgaFAOyGGgaHAOmkHk+BHkeABjsCpDyAAE+BDG+BHWWCD+7/HlyXHlwFqDxBsDyCJqEBzYAABIEACoACM4keXYAAGIAAEoAeFQMUECmgHl4BrIAAUAHNggfagikfARCJHl+KAEuAASiCHmCBAdIBqIEBK48eX4AAQoceX4MXxYE7jIAR8AEGjR4bATKfHlSTADkBKoEAGYQeVIAZlrceVIAATgMGDDCpHkoBBoEAfZMeRAEGhBizAgwtnh5AAQ6AAAoBDoIeQAINLIANIZIeMwEMgA+mgQApAWuAEDyLHjOBBBOFHjMBJ4MEC4IPyoAECwErqAQLkh4hgTmHjx4jgAGbAWCAAD+AHiOBAYyCHiMEBUEeSYEl+wFNhQfBix4qASeKHiqACNeIHiqAFZqDHiqAGWGCHiqDGCcBC4MeKoIcm4QeKoEa440eKoBFTIEeKpgEJIAbR6EEJAEKgQBpgAS0gQBpgAAMjx4qiwJ9AQiAAMaLHioBFYMLkYAAB4geKoAADoALnwIhDYgeLoADOgIiFoIBJYweLgEmkR4ugR5DiR4qgQHhgBGrgT0piBrzARODGvMBGIYWcAEGggEFgRdSARODF88BGYEXT4AdNIQXz4AAvaQeKgEZgR4qhjOpAQ2IASaAAAyFHHIDBSAKggEcAiAKgwEcAQ2LHiqAPQqFHiqAHbyAAn2CAeIBCIQXCIEUcaMX2ocAZQMFIA2eHiqAFOGAAgaBADOMHioBBIIAu4oeKoAgB40AlwEkqACXhAIbgACagBEXgwIghx4qgBnHjQBcASOpAFyAHiqGAFyCHiqAEkSEHiqAA04BC4AA8oEVnwENmx4qggglgQUNhQG4ggZKgQHPgBHwgwQmhALIgBLdph4qASWIHiqBAuuEAwCIHiqHAu6MHiqCADugHioBHogAQ4weKoIAQ4YeJAEWhx4kAwUMK4keJAQEQQZJgBGXA4ICSYIM3aYIsIAFjAIOaoAFFAFrgBo3gQV9AhJrgSgDgRaRgQ7CghaJAxwiDYEXF4ADkoEWwQQgaiEhgAOXgAAMgxtmASKDAA2DA6QBI4EACwFUgAOkgAAHA1AhGYEABwFAgQLIgQ7QAQOBAAeBFheAAAcDMCEkgga/AQ6BA3KFBrSAMJuAAAuBPrgCCGqAGKGCRckBcoIKeYEDTwILIIAroQIgI4ID6oE9DIRBLwEGgQP0gAzngRl0AgR2gQQWgRuUggHKgBtZAy0AAoEZSIEjIoAcU4ADBIADpoEK8QEGgRshAQmAEhWCHdGCAC6CBO2CA9OBEB+CAJiBIYCBAt2CBk0BCogAqIIAnAIIaoAAT4IAeYABAgEEghqmgTyKgBoEgACJgTF+hADfAQqGAv+BAAuGAN+BHPOAANiBIeOBAOYBC4IEyQEihADfhwDbAQiDG+kBCIEDFIIA24AWuIFK9wF/gACWgQC7hEUegRt/ggOIiQNsgQXvghDsgD8SAQOAGuYBGoMAgQEDhAAfgS7tgQA4gACHgQNhgAC3gwBsgwFHgAEighuAgwDaAWqABVgDDCAfgBjwgxs/gBo+gRkcASSBGzyAAdABxIEbPIAbOoAGaoEdGYEXa4EBVAMOICCAACiDB4KAAIkBC4EFmQMOICGDABSBABGAAESBIhaBGQiBLWeCAbKCGvqDAbKCJUSCBpCBQrGBFawBDoEaioEAfIAUzgIiB4AXcaIANoAWOoEEYIAANANrIQmBFnYBDoEET4EAhYAAB4AUuYEZh6sASYABKwEJgQRuAwlBA4EXlogAOoIBtwE6gAFnhQJ/gBT9gQU7AQmAAFWAAjqBAFWAAAeDB5KAFVGAIMKGADwCCUGAQciAFsuDAq6AAJyCAG+BI4ABDIAcS4AAqYQAKIAADIQAZIIACoIAZIIAVoAuT4MF/IEAcoAQJwECgEqvggBmgAJNgQAqgAA+gAWPAUGCC26AEB2EAGaAAOEFLQAEOgCAOqGAFASAABSAAo0BCIMeHYAeG4EBAIId3QMIDB+BHsCBAhmBAqWCAh2AEOGAAh2DArSAANKCCKeCIUuBAf4BGYcALIcDI4YALAELgQnQgiGTAw0cGoAhdoAAFQEbgQDyhgE/gQMegCAsgBsOAU+AJNKAInGBRAiDKKqABPMByJEjD4ADpIoIHIEeLIQjDwENgQNNgAZtqwgcAiANhSMPgABAAgAigAZLiCMPAQuCHV+BJjGAAGmDIw8BE4AAlYAANYMf8oEYgwEFgBvMgBqYA3EgC4gjD4AKDoUf8qUAiIAKLIMDnQELhiMPAQ2PIw+BAFmBARuMCKwBDYIjD4IUw4YjD4Ao2AEIkSMPAsg3gwAblCMPgikPhiMPggSDgAAhiCMPgE4JgQqjiQGGgAC8hADuggqTpSAOgADHhADOiCMPAQuFBI6DIw+AARWBAOaCARWFB86AAjQBDoEPNoItz4si/oAK7YEMXIQDYYABqoIUX4EePoIHUQEKixBlASSkDFqAHwYCIA6CPQmMHZuBRLMBIIJFh4AZO4EHXAFGggecgBHOgSDHgRD4giJGgRGLgQJPgAG/AQODFGGCAJaAADeABK2AAl2DABkBKIEWV4MUcoQQToID2oARQoERQIAZyZwQ6YIAZwIbRoAAMQMAQeeKCOKABVUBEoEs7oMmkIAAEoEWqAGAgAS3AXSDACaTEMkCvf6CHleCE+wCAHGBR/+BDhUCDB6GIISABHKCIGkBBoEBaYMAFIAAZo8AHpEAMoAtyo4AFIISxwHOhSQ4hA8Fgw8WAQaCLAKBJDgBCoM3joMOnYAA2IEANAHPgwK7gRZ7hyQvgAECAcyLJC+CAZIBVIADV4sCvoAcOgIgCogkL4cERKQqioMDp4EdGIwkLwLIN4MHGYAcjIgEPYokL4EEPYAZxYQEPYEHvoEeaIUEPaUAgYsEPYUDW4ABIYEILoAFPAEKggChgB0vggN7gSfPhARFiQNfniQvggFgiyQvggQbgQ53gRBpkiQ0gAFkAiALhCQ0hQQmqic1jAQmgyQ0hAQmgyQ0iQDFgQ03gACEiSQ0AQ6BNTWAKX6AAMCHJCqCA9GBAeiCJCoBBYwkKoII7o8kKgEShiQqgAoUjSQqgQBEiCQqgAAiiiQqgSIugCD1gyY+hyQqAQuDJCqBAB6FEUGJJCqAD/eLCLGOJCoBDoEkKgEOggBNgAUThiQqhie/iANggSkGjQAUhyghhwAUgAA8hQHzggT9gThtgQEDgSvPgA1nggFVhgx4gRJ+AgN2gCFugx28gAWWAWuBEYEBIoQMngETgCNogAh0gROFgQA9AQWBTJyAE4qBA3aBCDMBBYIByIEMposbGYAABwEEgQR9AUeBBP+EBraAQr+BEt+DJKcBBoFUmoMVwQJBuYcSlwEUgAkUgxbyggFegUXxgSzagBKWggHqghZ2gB+hgB93gRtxAQ2EAAoBGIABnoAABwEUgQHEAQWBAgOADNGADKuAAZaAJEyBGriAHTkDC0sbgRLQgAAmgAoYgUSQkBjMhBbrgRL7hBeWhRL/gQD0AUSEEuyEEvqAAF2AUSqAAL8BuogRLQFEhhf9gQDFgQa0gQaohA93AWqBA80BA4UAx4EfrIFE1gEcgVWbggK2AUSACHiAABEBIIEkc4MSC4EAdYEIMwIgA4IU4YFRyoECQYEBGAJJG4ACPpYYaoYAygEFhADKgQB/ghOugA40gADCgCDkgimehBfGgR4Ygh2qgADGAbuSAM+BDNOFAM+CFNmVAM8BJI0AzwEo5ADPgzYliQDPgRzVAkG8iQJdAQWBAfWCBM2HGfSBLvSgCEWDAJyFAJGAAuIDLwEcgU7wAwBBmosJgYIXwIcYnYQaKAFBgDowgCb7gADwAQmDG1GAEhiMHMyMGIKBBGqAFDmCBGgBFIAACIoI+oJGeqAI+oEIpIEjc4IDkgEggVLLAwBB0IoFFYIApYAF6YQXyYIAuYMHo4AAGwEWgRaWgQCpgywOgSwfgUAJpRC7hBN5gQVhgTTHgAlfgVNMgySngShjhyhiAQiBCvaAABCJKGKCCw+WKGKAAG4BOIFKtIUoYoMokI0oYoAAmwEsgQG7ggYvgAbRgQfZAQiABZaFKBWQKGSCKAcENCIGaoAAJwEJgAAngU8ugCWJgSWNAUmBIagBCIAAOIESw4IoZIAAI4AFIYAQBIAmeYEoZIAAlpMoZIFO84AC74IowYsoZIIPXIsoZIAE3IMnnQEEgQGFhChzgEyChShuggDOlShphQKmhwrPgSEqgACmgwq4ARyBWaKDBweBCtSBEQ0DCBAngySPgQALAigLgQFbgQKOgAAHgijxgQXauSi4AQWAKLgBBYMouAEFggCVARuCS8kBHIYouAEXgwJkgyi4AQuAKLmADMQBEIMouQEXgyQjAQeHJCMBJsEkIwEKg0DqAw8QP4UACwFxhwALAR+AAAuMIosBCIAiiwLXJIApQoEhuoFPOAIQNIEiQYArJAIAGoIC44EBY4QiiwEcg03ZgFWegwCZg0qfgQDqgwE0BQRBmgVHgCtdgRpgAYeBA4uFKZGAJteCAx6ADEiAAHmABDCAAXiHA0KBAa0DABA2ggApgwcfgAIdgwE5gAdfASiFRpUBBIBWdYFFNgJBd4MkNQJLG4EP3IQAEAcDQQRKG2pKgAC2gBBCmCI/AwRBKoEQgYIAqoNEToAEcwELgTCxgAB3ARiDDqYB8YIEpIMwDgMwQQyAIUgB8IEY4IEEOIMAsQGIgACHAUqDBgoChAGAGdYCAkiAEoEBwIEIAgEDgBUKgAAMgAJHAcCBUPkBBoACA4MbX4BPNoAAKQIgcoMJdAFsgSUUAh9wgEChBEEfcxCCCGIBbIIX/wQALwEygQAQgQAJAzAQPIEBSYQNAoMFQIIAm4IBLYEBOIQEc4EAYwMEQTmDUfqEBXiCAC+DBhqBGYqBA0uCAHqAFVsBH4IOl5MAHAGLgRxvlQAdgCEOhkzogyMXkwAoggoV7AAcgB77gkjPggGQAQmAAeMBQYBGy4MDzIIBroE2lwICSIQBjpEARgEggBKFlgBigQfVjgF+ggLUgwKigALmgATxASSBCv6BAyaADEWBHtiAC/OABRKBCq+BBPaBAvqECgeCAF2CALKABLGCAH2ABpwCR0GBBGYDCBtyggC4AQOAAAiCXdOAAAgBEIEITQIbcoIAhIAAX4IG1IUATYMcQIAKH4QASYMAqp4AJoIi0YMAKQMvAQagAE8CLQCBE4mcACa9AX2CALeCRYWcAI6CVlmBTU6BCvShAQyZACaIAQyAAcABC4ABs4IYxIAEG4ADQ4EGn4EAN4IDUoIdZYcKQwEgglsygwOBggRbAcWAJpkGBQIJCQkDghSLAduAMFmBUaUB54EMLIJaAoICLoIoTocAxoAHbwIvAYAG6YAG54EOLYEAbYEEaIFD+YImgIJPvAFPgwPrgAoXghm4gADSgjGCASCAAL+BFpGGHtCAEbuCBzaCACMCLEWBBHgBT4QZlIcA0IAARIAGpgFrhQDTggBJhBIwhgLcgRWlgQwTAQaBBPaDDvKDAuuDQLmQAIkBBoUAhAEUglKdigCHgAClAU2RAIeBAL2GAVqBAVKCE+KGCbyAAD0BHIMGEQEUgiBzgQAThAEjgU1PgADvgkaLhADqAQePAGOAGPeAABiFAGOGBTeCAfuAAEqEChWBIPmBC4SDAQqEAiGAEzyDDAaBBb6EAjOGALeBAjCBDuOEBQ6BAIGDBg+BYPKAGBqBB2OKAIaAABaPAOkB24IA6YYARIIre+MA7IArFq4A7LEA6gHniQHLgQNXgQDIhADUgBdjgh1RhQCpgRPDg0tnATCXAImGAB6aA8uJBwaBAIeNBbiBKUeCAs2CNmaCAAqCD66CAAqADAaEAAqDAI6CK3aAADgBdIFF84FJqIED8oAIP4E0NYQIV4IKc4EE/YMHFQMBEDWCMCeFCOCABQQBAoUfnwMCQZSBESaDRHaFAFcDAhA5iABihBUJArQtgwxCgQmrgAAdAVyBYO0BToFkWYELnQIDaoE8xIEADAFsgAOmBEEBEC6DACYBbIId8IAGfQMQNkGABXSCAAuAA6MBG4MA1oAAVgFggwBAgQArhgHzgAANAqAtgUiugAFNAqAtgUhTBCgCmC2JB3SwAB+DAbCBEg+BFD6ADCuAIAmAACSBHxWCADSADPGAEk0BdIQAt4EPK4I/IIIAToEABgKkLZsA+4EQsYAB448A+IUA9IJhNYIBIwKgLYIObJ4BRpkAToACNYMBRIEBv4IjWIMhfYIAy4BF/QKDAoIVWYYBYwFsgyVogQHaAgFFhwAlAklxgA+VgDioiwAqgSFHgQ4ygQCVgBbHggInhgICgi3iwAICgQLsgwEMhCrJuAEMAQeEEWKAAK6AD7OCET+CAO+BWueAMvQBAYFJ0oANxoEV44IPA4Id/IYACoBi0YEzCgGCgRtkgAkGgBFoiQACgAT8gBvygBE6gR4vAQiDWXWAAAyAADWAGfSBAAqBTyuDAAqAAx6BMjqAAAqAC82BY6WAAAqAIKKAXYaBAAoCB0eBPR2BGMCBHoSAE+mBFdOBE7YFA0H6AUmBHreCEVuCP8iAFd6BBAOAIsiBAAqBLMWBHMwBCYJN1IEcrAEJgk26gRyigh3DgC/CgQAKgRDHgSJ8gQENgAnLgBRfgADUgl4Hgjl7gQcFggHjgAMggQMJAQOANLCAL3eCAHCCAyyCAyqBZB2HC3aBACuFAB+CBNeOA2qOAB+BAFqACAOCBaiBG20ELQCQIYADdYASjQJBhIEffYoDe4Au74IuRoMCfoER6wKIE4IAHAGIgCTjggKogicSgQOYgwyqgwOYggKUgQB/gRYUgQHmgQQ8gQNUgwnJhgDMAQOMAK2GAB+CAE2OAMyOAB8CIAWBAB+CAYmoBDaEAJyFBDeEACy0BDeAHeiBAO2BTj8GQQxsQZgggGi3AQCAM/UBC4AATwF+gBmMgzFyAZqACWiBV9gCQX2ANpSBNKSCADwBBoExVoYJ5IAA3oAExIUGCYALCYAKHgUAAQEBAoJU3IABewK4LYMDoQG8gAEKBXRyIgY7gAASghDCAwNBDoEy1JQLLQEGlwyqgREjArktgwyugFXkhQBdAmt2hABdBANBDWuCEbuAAt+AANEBNoAAHoQAcQEKvwBxgCgygQDAgQBzAkEJhABnAgdqgBRDgQBlAhAtggUQhAeaASuBT62CAaqAMZuBD8SCZkSAAA2AFxmFKHuBIluBDQqCTg6BAfyFNAKABRiCAAiAAbuDKOeGED6CACKCB7yDEJiBJK6CBVcBGIECDARMDQMagwhCgQHcgWdXlQDVggOQhAAqlQAjhQhsgA+ymAAmggAjAy0AM50AI4AAC7sAI4cAjwEKnwCPg1EKlgAjghUlgh/cgGp4AXaLEJCDAyoBGIFniAFKgwbIgGaVhlyIAkULgjTzAfqBJyQEQXsLHIBP7og1CwEQgAxhhzavArsBgDaMgRJwixL3gQ63glZcmBL+gAAgAUScACABQJwAILATXgF9ghJoAfGAE/0BC4FQ1AEBgADEAQmCE0sCbBCBcHOAACcBbYET6gcQQAu6CQEVgTXcAUCAJWSCBtICBkGBOZODDdYCIAeBEoICCkGADTSCZvYCdGqCBOWABPCAScuHBPCAABqAFvmCDXuCV76AF9cCIQmAbgwBDoEj+oFA3YIAQoAQTYIAQIEKeoAADIEkY4EAMoEkJ4AABIFOSoAW2YEZpYAlu4EsBgEQgB8JgiomgAA8gi8UgAA8gjtVgi8UgSNEgCG/gQAdgUo2hAOKgySKhABYgRuOBAhLGyGAOd6ADFEBAYImL4A8H4EA04EAzIE67YIAuYIAQYIeXwIgaoEAZQFrgAkAAgBOhGhRgAALgAIXgQCxAkdygBkegjGogCLQATuAI7KDAFKAAO2AAK6HAS6HASkBIoEJPgEKgwCfhAExgABagwEzgWEhgixSgAANgS5jhQFBAkETgUDJgE+KARWEBYwDAA4CgAuPgT3IDCESQe4IIRVBrgghFIE6bQF/gAARAvANgAARA7ANIYAyQQEBgBatBA9BCUuBaXuAZVyBYOABAoAU7QFxgGnDgARZAw90IoAHPQNrIReDEfCAKZOCDWSABIOBCiOBY84DdCEYgAosAX+BEcECIBaFAMKARQOAFDEBGoAyhgISTIRCNAHggjznARSBRSOACimBACaAQWMDBiAVgQdoAwshGoEk7oAIXwIiDoEBYIApw4BGaoMkzAIgGIIOLYEeZIA9EwEHgyyKAiAQgAFJgCUCAQ6BJMsDGSAagQP1gSZCgl+oAwFrdIMBYoE+EgF2glxhAQeAWWCJAhOGAoiAAbSEAoqAbMWAIcyBUswBB4FxF4AAy4FRjQEGgh9cgijBgEx5gwGwghzNAQyDChSCRUkDAiAXgCBFgRpQgwElgQAYBSAPIgkhgDdshwDLgQRQgQC2gBlMgQC2gRVPgRPWgD8kiACygWIHglmngD4JgmzwgwCYAQCCbV6AAJiCAqODX+8CIBOBAFaDWyCAJKGBAmMBDoEJ4oApA4YBiYQAB4Ifk4AApYEg3gFGgADKAQ+AbNeBPZqDGRkBS4Il/wQgDBsigEflAQeAALIBGIIBegERgQFNgQGTBAZ0IRCCL2eBA3EBDIAvvIEhoYA9cYEBToJKM4IC/IAFUAFKgW2bgDzfggJUgQJNggIgAyATaoACRAPTBkuEAlsFE0HRBEuAAl+CFEqAAtqAJUCCRa0CIA+BAReAAtWDCSCAM7WAUtkBdoEBMoAhOoED0oEAbIECNIMDrIEDyQEAgwMPgT5vg04QgwMdhwOTgAAYAQ2BAAiBAzyFJ0EDDgsrgAFfggHLgATbhB/hgQSTgVzwgQAHgmW8gGr4gW8AgwT1A2BB1IIE9QLEA4JxZYQ8goFV5QHVgRgkgRcbAdWABnSCAAeDUS8BAYEdcoMAHoMlpYAQVIEmy4ADNIEOkoFRBYAcz4EoKoEMDYM364AOYYAIxQdBoIbi7X5zgiASAgFxgXHngzBohBwSgAoagAoQAcCAb+6BABaCIaqBAGiBHKKDbyABc4Agu4FrpIAuKAF/gwKuggDlAyADc4InW4FyYYAAPoEQSIAAKokA8YUCXYAAQ4AYjJQAM4ACoQIIdoEAHoACwYkAHocAGYAC4ZMAGYAcDZMAGYAQuJMAGYAHMpMAGYADIZMAGYA71YoAGYIA4oAdUIEA4oAbRIIA4gMLvQWCB5aCA9qAACGAPKCEXiGBCviAADGAAPuBA60E8f8Da4ER+wRB8P8DgCDEgWqOgXKlgXaGA4CAPIAKF4AAW4IAGwMgAHKBWbqCdRKBHpiEAXaDAVSGAFGBZsKBdD2CAXGDBvSBAGMBcIAAUoEHc4EAbYFjLIIAUoAAUIACKQLbAoEMgANBsCuBD3iAbEmCDjeBAmeDAE2DAA2BMtuEAAuBDZmEAAuAb0qFAAuAALaFAAuADiGFAAuBFMCEAAuADtCFAAuBDUyEAAuBae6EAAuADqqFAAuAQOOFAAuABAmFAAuABZiFAAsBDocACwEPgQALgnWugC0IgiAsgCGJgQR3gwD4ggLZggAJgQGkArArgwGlArArhQKIAQKAAr+BAVIBEIcCyKQBUoYAWoEj/4QBzoJsS4ICuIAADYQAC4FmI4QAC4FxyYQAC4ABMIUAC4FooYQAC4FmXIQAC4FsqYQAC4ABMIUAC4ABMIUAC4E/YYQAC4ABMIUAC4ABMIUAC4ABMIUAC4ABMIUAC4UBMIACZIMBDAEQhAELgRezgS9aAnRygAFEAwsLkYkJeoARooMInocJfAEGiAl8ggUQhQl8gCjFhwl8iAjyhwl8ggBCgTpeigl5gUV3hwl4hGZsgXA+giR1BEHAAjaBDMySABeCTJKBFZGPCa2CB0+BJFCjCa2CCR2DCa2ICjeHCa2ALDyCAFyAbpiECo2CdCiABh2BCYyFLmiAEDOICa+ACMoBToEINYBbzAEggENVgWGnhAmyAg0CgFXfgSjkhgmzgQiEgD5BjAFnhwFihURoiAFqgQh/hAm1ggAXASCBCGuFAI6CBbkBFIAGzwUFIhMhFIwJtQKBAoAJMQmgDyEUQeAOIROBCbWBCUICoBCBABEBD4BaUYAHWAENkgmzAgQagQAbAnQigEraAWuAMiCECbQBDYIXHIEJtIBUJYAAIYAH0QEWhAm0gACAAiAVhQDDgCvAAWqALtMBGoAf6IADdoEGqgEOhAm3AROBABOAE4OFCboBDoABdgEUiQm6BA9rIheBAWuBCO8BD4MJugEHgCKBggs7gijzgAbZgQfmAxggDoEH0gMYIBeBB+0BGIMJugEGiQm6ggFpgQfJgilNAiAGjQm6hQLGgAG/hALIggkiAQaBCSIBBoEJuoAAz4FB9IM5f4UJuoF2v4gA64oJGAEZgClKgEaAgAAoAQ2NCRgBD4AITAQPGyIPgRq3ARGACVaHCRiAAPGACvuADKqCCRiAKcCAUESDMYCCAKyBVimDAmWAUdSBCRgBB4AkUoJldYIJFoAj9AISaoABpgHUhgkWAxJB0IIJFgEHgFQCgkX7g07lgE6/AQ2EMO6DMP8BEYAYfYQJFwELgAp+gAM8gQBrgAGRhAMWggkXgAM1ggyqgSzbgQAYgQKKgAKAhwL8giXJhwkYgQVugTXXgjBOhwqoggGkhAqohgp2ARKECnaCNjGCCncDCwuqgBHygQdSgRY6gTIzAwFBnoISRQQAQYgTgAASgAJJgmzJAkEegwAVAfyBYfaGABUBE4J8a4AACYAAWIMD4YgF0oABMAM7AZSAbC2BDqACsC2DRRIBqIAACIEAEAKgLYEToJIAOZYAGQMLrwKCAKyBD++BEi6BDwKAEkABBIASnYA8xYAAEoF04gEEgxKdgg8ugRnIgxBAgkQpgBBAghPBlAAcgAb4gxIsgmLNhABdgBKdihKbgTJGgxI0AgAQgEX5gwBKhxCmgwBKgjValQAchRELlQAfgAL7AXODFTCUAKiGHhODECKEJI+BD+oBEIA3E4MANYBtRIFAYwGngBPQgkdRggDMAwFBCYgBG4EBWIRtkIUA/wG4hAD/lQAgggEfgxK9gBKvmQAqggBKgiIggwGZgQCAgm76gAH7gQE8ghRwgTkkgQA6BMAtC6aFAKmBAeCEAK2CSie8AK2FAIKCTUqBClABSIJtXp4AVIEAP4cAuoAKgIIB9AQLC/wKgGgFgwarhQX4gRtcgxJugQwyASKAKw8BLIETvoEKnYEDVAcJQf+A/59/gjSsAQaDP3qBDB2BB0CBGVmDBzaCIyOABTaBGWyGBmKABxWCAuoBAYFwOgMvAbyEAAgByIAACAJBIINYfIAMh4E9KIAcroAMW4EAOoAhtIIRcIUWKIEYFIQpGoAOX4ANaoIpAIEBFwWYFmoQL4IACgGkhgAKgACwgQDFBJwWEDCCABCABAKBABABqIUAEAGwgwAqAkH+gYAdAkESgQYjgAECgDVggQZyAQKDL7OCN50B8IBBxIMA2oMF5oYyD4EATgEtgQAygBe6AwVBEYABgIEEEQYoAqwtQQqAIsmAWQ6ACm2AJteAAAqCLFCAABuAHKCBeOCCEYaADXyBHpKBGrSBTt6Aeq2DHmiCJjECECuBAICCBByDdcGAAnOAGA2EACGAFVOABCeANWsCciKARriSBC2NAhGJA8eXAmGBOC2FArSEBC0BAY8ELQJBoIBBjAMaEDGCAoeBJhCEAI2CdwKGAIeEAJq5AI+EAz0BDYEqpIEAmoAAlIIKi4Q3AIRMRoEAk4EB6YEt9gH+gls+ggHogUlaggEXAQyEAJCBIYuHATK4AJgBBYIH04kBKoJuggELggEohABngWwKgAKxgH88gwChgACKAQGHAIqAYzDCAIqDCF2WAIqCAGeCABKHAIoEBkH9/4MBJYIAkwENhwEdwwCTkQEfASKAPaKCAksBDIIAmYcAb4UAGAEEgACfgwHKggQ0AQqGA5iAA+uCE3UBCoJCtoEcbooDk4F/a4YAR58DBYEnV6AAwYEZz48AvIgDB4kArIYEDoEEcoAAkAMJEDKFBHCAZ84BB4IADoEgqQExgReWgH0YgiGJBywLC5YLARKBDT8EIGsiD4AqpIJ1Z4BhrYIXj4INCYEX5oElogEAgk1NAtDHgAhxAdCCRymBAAQBSoKDbwNB2CiDDtoC3BaBVeMBf4MVFIIMF4Fqa4ESWoBXbwEogW3ZgBT/ggDagQCkgFd8ASiAAUuFOeCBLzyBFG+AJjmBVP+CcE6BQtiAH0mAgh2ACPiBAMGAfvuDEqGDBPeCHB2ABO+BNG8CCRuBFoSCbjKDBP+CE5+ANG2AACMBrIEajAELgXQrgwBSgB4bgAG3hQGiAdCALZSAChWEAJCCFVSEcM2GAHCAa6GCLFeCCgyBBgWBCduCAXOAAV2DJiCABmyCAPSAB8iDBrkC0CiCABGCAO+AAISAAF2AABUB4IAMBoICQoIAh4JF4gLgFoAAEYAfRAIQM4MAjwHUgACPgjGlAdSFADKCHwiCAJeABm2EAP2JACaFAB6EATSCIYKGAOoBBYMK4YMMcYEA94INhYN4QoAMKIEfuYEWFAEEggAKgBokgR7JgADfhCHNgQr7gC1NgwsCgBw/iACthEPxhgHcgCshhAaQgwCcgACOggCcgwHhggDKgw8MAbyAAieARc2BGfqAcEqBAmYBCYYCcgEQg3wZAQiDW1ABBINOpoJD74I0hIAKRoI8T4IsCIUcOIYUEYIx1YEMrYMAhIMBYYUK94AxP4IJ7wHUgACtgACUBrwETBshEoIHboIBzoEjGIAv1IAx+IEvNoQAPIEktYAX84A0QoAB6IBSZYQ8YoFDwYEANYEHJQVMIgIbIoIXgIGD9oEqEYEFdAIgDIIV/oIX34se14IU8YA+jYEEIIBIMIFWRIMAbINsZIMHzoAAaYAAfIABpQMQamyDB9GANB+HAtmAQN2AFkeAAIaAAcOBACCDAt+AAMqChuKBRyiAAHaCRNkBAYICg4AB4IEK84KAvYE8noIO3oEI0YAASIE6poIOOoNIvIEBHIEArAECggImgl+igQ5egg+4A0ECSoEABYAtGoAAO4EAXYEAlIQAboEOP4IC/4ID8IM4LIEtKYQBR4EBEIE+HYIJWIAfxIEBQoAFfIMFT4MA9IAAFIEIVQIFa4QA8oAR+4UDbIUTBYEK4oAMuIIWuAMAQbqAAkeBAU+BEJCEAhyBGvEBf4I6nwIASIECxYIEioINWIQbhIMNBoMAgIEFBAEPgwJJgS/RggXIhgGkgoIfgQB8AXGABdiBDj2CAmgBS4QD6IQ4NIITv4JD+IIAnIUNpgEPgA5XASSAFa+DAF2AhreBHHGAbuWBA3yBABGABt6JAraBhVKAA62AA1KHAOsFC7YCAQmABxmBOSyCgmyCAsaABtECOwGAP0sBQYACQoAE7gRBB0GKgGbHARuALHGDDkaBHC4BCoE6ZoEEhoMBAYJ1voEK2ICGroADHoNCyIIaBYAZooF5K4IW7oGMzIQC2IAv24EET4EFjgFLgRBtgAbOgAVegSe5gAQHggE9gxotgALtggDHgh/2ghYqggcdhQAlgHDohgLzggLYgAtugRCLATuAAAeDQvqBCuYBCYJ1KoEAHQHAgwAdAsAVgweagAASAcSDABIBxIBivoARWAIKQYA7hIEEtgRGIgMbhQD3gCTwgAMlARuEAQ+CATgC0AiAATiDDESAJPqBAF6CCr2CCY2ACr2BAHqDBpCAIryAEYeBQNGCekOCB7YBL4EFDIEANYFDOIIikIMBgIIAkIEOsoIcfIQHlYEhwYIPJIAHp4AzgwIDSIcH8Y0OgokPI40AHIgH8YATp4UAXIAH8YMPgIEFqIAU+4EMeoEAC4MK7IAk7AKQIYFBcgJ0IoEWpAQvAYYIiwCmAoQIgDawgwBLAQeAAKeAAjaDCJmDAKsBB4gAq4EHeIEAj4JUAIUtQ58Aq4BY14UAYIAAq4MAYIEkJoEAq4QmF4UInwYJQRxrQWyBF7WCf1YCkB6BOnCDAIyAAA8BoIA0hYA0mYMAkoAaCoIJSYBJAocJ/40AhoIuOoQAHJYQcIwJ/QEEgAqSgzSVhAChhABqhAAVhQCrgACCgQB6gQq0gQ1jgCbRgUgggA4SgR8eBIECSRuAAXgBI4MBeIAW94AC4YANoYMAt4ECGYBEpokRN4AAfQEGhgDakgCupBE6hwFsgADHhABggQe6hgFsAQaGI9oDCUEEgVsjgAjFgAFpAR+ADLCAADuAAAsDoBwigACLhAKigTSwgQK8hAIVgwB/hytZqgIHgYAYiwFnjwCghwByhQLShgCwgRzFgBhsgiF/AqAtgUNygALeAy8BgoGGLYJ82AMvAYCBcryBAD2EAhSDXbubA2+iAiKBETCFALiAgMuEAQ2AiIqDALaBeM2DEKEFswsBCn+DBWuBBY8BIoAfEIEw7YAs9wEbghsvhAV5iwV1gI/CghzcgA6LgQcVgALygU2VgTgkg00Xgj+EgmoygIMmgStDggWEgwVxgQs4gj3SgBVJghVjgABmggTFggDEgATFgR1CggSagQJ9gAFbgQJ9gD2OjAElgAHyAQWIASWNAeKJASWNAByIASWAXOCEASUBBYAB3YMAYIGCjYQBJ4EACwELgQqGgSXyhR4ngRXehxA4hBRUgXrdgRA6gQX4gAD0gRTlgh2whQDmASKCSSaDix6DIeSCA0+CAqaAHluCAfWZA02iArKCI/mBBWCBAMCCEhuBbjSABByDAfOBG0GGD86CfFeBBraDAIqBKraBAQwELwG+FYB2H4YEs4kDRsAAlIEEeo0AlIAF/IAAJ4IBZAEFhQ83gB1chFsFgSoXjQ8zgQ4TgQBtggasjA8zgQJrgi9njwHtjAU2gHcFgyfhgVCZgA/HgQaFhgBxhAAagCs/gQAagkrKgDwQhHuAgQfQjQE3AcL6ATcB/oUBN4QPmeIBN4APrJABM4NOxIIBJgHEjgEmAcb6ASYB9oUBJoIqHeQBJoMqOo0BJoAIQYN+WYIj/4IDkYIKA4At4gFGgA1zgQWPAQiBBYqBCgOAAA+ALiGBBY8BCIQKBwL/AYCX+4MQmoEJsYEQmoGRooUMkIBNOoAMC4FKnYMNKIMOBYCNHYEAnYAOzgEEgAyugkONAQSAHRKCGyuAAWKABV+FAECCBLKBBKWBelmEMPOBABiALt6DABgBDYM9nQENgSpzgATvgQ9cghCPgAAIgj4agAuPgw1cgBraigBCggBjggBagXhbgQDtgQy3gQA/hA+tgXl3gQEpgg9Vg39uhA0ehQAVgCmLAwALg4EahIANGYKMDoQ7zoF2X4EACIVf84ApfoEACoEPggEggS+3gRYHgz0KAduAG6oEAUEWTYAru4AGs4BfxgSggAJxgCe4gQBNgzb1AQGAm8aCC9oDQSpGgUA4AgVGgV/lAwBBOYEtAYEG+YACXwML3AmCAYaBkPqAQs6CAhQBLIEr9oAG34Byv4EAD4AAA4BUXoIruoMpOYMXo4J74YJ64YMCLgJBKoAWwAJ1IoB5b4EBtYACSIEAFwFsgwg5AVyAJaiAAYiBi42BmLaABI6BAGuAAtyBYhyDFJsBT4ASTwFLgRbjgBwAAUWAZfIFIARHcnKBZFuCLJyEPNCADFuAanOALKmBArqCAs6AW2qAHU2EFgOFABOAIpmGGnCHABaBk/WAJCqEGmWHABiAHY6GNKSDLnaAHKKEgHOBARiBAAgBOIIAxoFD5IEAt4AfvoI33oIBBIBEMoEAJYE3q4KLFIE3fYEvroALx4EADYAD8YIDboIAXQFcggANgVH9gDfGgQF/hRk/ghyqgDWFAhA3gi0NhwARggBWggANgQdeg4kngTlhhBrqgn4/ggFjgBCcghjugQMTgn/Tg35DgQGEggJ8gRB6gYGUggSbAiwigjMagnvKgRyjgi+MgQJjgQEkgQDZhAAlgi3XggPbAWyDAEOAABeAY6iBAdiAAWQBBIKY/IAAkYEuKIE0KIEASIEDw4FFAIQBIAGwgARGAUGDg9SCCUGBAHCCALCAAEKBAAcCtC2BQI2CErcBtIMAGYEwFoQBe4ADUYNBOIIAkAFsgSTPgQCLgglSgQChgwBBgWkGgQq/AgVJgDrTgABhggBIgQC0AVyBBT+AACMCxC2BHueCABMCxC2CDtUBBIM0JwEBgAMkgZ9RhAFCgTZXgSIAgQL+gQGtgBpkhgD0gi8LhAAlggCygQLVggmMgEILgCo5gQBfgpJ7gwCggTnLgQHphAESgomvggFZmAESgEgVhBOsAWyDA1SFARyCAYeCBo6CAnCCP+yBBYqBMs2BG1iDATaADQEBA4ICP4MBLIGUmoMAjIIAOIUBLIAAo4QAPIABToMAWJABJIQBAYAMkoAKeIQDy4IDCIUD54EBDoAy2IIDt4QCUoFG+IAD0IMhhoAQtAFFhQO0AQaAYV6ElV6CAWODgx6DAKgBOIAFMYIMfINHdoGAO4ID7IAE6gEagzHAgwGWARqCOzWAGJmBA/yDA0qBAwGCAWGBA7KBEucBQYBa0AEDgorSAUGAQkuAHV6AJIUBi4Muz4JjnwEQgAqkgy9fghfJgGs+gRqTgZSshAVsgjkFgBo7hQJxgBT5ggN/gi+VgAAYgAANgUSGgQQ2ggANhAPVgRptg4FPggBdgWVqgwAcgjVdggAWgACQBBALC4SBHe6BADKAZCeCBEiBJ6WCBAOCA0SCXCyCANGBAiuHHWiAOaYBGIEyp4M4rIIAcwEwgh73gUB/hBGLhQAThDpohABGgACkhAf2gAS4gAANgSI8BQuECQEPgQd3gSDogRk+gR2ugiSDhwByA3RBhYJaSAEAgTcpggARgAKzAoYCgjy1gzCEgzmvgTU8hABuAVSDAriDAoyABwSCAe8BSIEABQNYdHOAgKOBS3qAAA2EAq4BNIAfAoMWcIBQpYMU04EHUIAJTIIDR4IStYQBlQEsgAB5gUUWAgNrgQdtggQrAhA6gjXFggD7gjU7ggT1g1N4ggA0gDTFgwNagTR/gQARgTTFggMWgAAFAXCABQSGCQ6SACqBjzybACKCNd2CBnaBhJqGNd2AEVyBNd2EFZ+DJUqBb16BUiSBXVmBDn+EEKyBRMCAF8QCkCOBCDCCDVyKADaCAHsBdIIA34EE34ABP4IADQKkLYEUSIEAlYFFVoABgIMD3QKAAYUeEoIV04AN6wFgggGIgRz7ggEkAUiDB7EBbIMEXwE0gBfTgQGMgCyFgQGCg0X7AVSATfeBAa6BLTmBAEmCAPaEBdeBFIqECR8DEHRzgE6AgXH3AUiCbhYBDIMByoAlXoIBx4EWIYJfWYELGIMKUoUAkYIpSYI1A4QAV4AksIA4K4ILfoM2+ocEuoQAd4IEIYAAD4FUqYQCQ4MCbIFU7oMBjoECXoEAGYIATYILMoIANYEASYQ7S5YBxogaprAAH4ML3IFSwJQBvYQ3FYMA1YcBTII3FIIBy4Kb1IFEoIQGToALSoE3GYIAwAECgzcZgQQXgjcZgwBGiATxgQAHgztQgpoMgaJtgwY4gAFgAU+AR+2HOqeEAF6CaZKEAF4BAYQ6V4GXJIE6pI0AXoI6pIQAYgEbg0YtAqAtgzpRnQBPmQCtgUaZgAdfgSH2Awu+BYARsoID4IALqYAD4oMKa4Kg0IEACYI03oIEUQFqgRSLggAdASyAA5qCBJaBB1SBEaaBlb6AGIyFBa8BcIAKVoFeh4QCR4AKY4I8vYQGL4EAHAFcgwR+ArQtgj7kgQuahAh0AUSBAAUBTIEd6YMRy4FEIoEAioABCIIG6oMQ7IAADIJD/gQgCE8bhCWjgAuDhAmAgwyeghqkghjOpQA7gBe5gA3PhAhogIXWgkb8gQJEgwV5gwFiAgRqgAcmAhA3ggASggfYAXSDADCBB9GBExCABYmEAneBCG6CAP+BQoGAHleCHDuHAzqBDQ2BAzyCBA8BWIAxKIAFnIAf7YBRFoEQJoEStYAAfoKUb4NAfoEqL4AD8gEIhAAmggDogAAFgEpLiAXCggE3ASKAUjSCA/uAHNyDAwWCGs6CAWSFHIeCHayCWIOBGjMBhYEACoQCHIE/0IUJbIMJaQHEgB9TgiMLgyUbggEJgCM+gAJlgWAGAYKCOwqBpCIBAYAADIAIhYEjHICKGIVKgIEDQoEISoI4p4Gc0YIPTII8CoAAQoGlpIECroGKCIEAB4QM74AHjIAUI4UAQQEBgp+Wg4b2gQCPgA0CgABDgRRxgAkhAwurBIAflIEAGQF8gRlHgCjfgQAMAXiDAX0CjAGFDTuECuUCLGuAAuOBGcCBBUoBA4Bh7YIFgAGQgJACggDbgAGVgAxUgAA0ggWQATiAHMmBoHWBURaABZQBB4I9k4Eq9YEu9oEE04NYIoEACoIAmgE0gB2AgQGYgx0pgQrWgF3AgQv/gwAvgBnzgk6gggAyAiALggiTgQAKgVo7hAANgANKgz4KgT34gxIwiGYwhj3/gACAggAtgQV9gT3QgAANgAHRgj4FgAv0gTEugAANgDpAgAKSgTEigAANgAnHgABQgTEWgAANgD4OgASegTEKgAANgD4RgAGDgTD+gAANghRqgQVKgQc8gBAMgg9KgC6rgT4XgAeMgSC4gz4egACfhD4egRB8g4WQgF9PgQAKgkAHgB3cAQaDRdOAETUBBoOhO4JbW4Ico4AA14IU84IeS4Ja5oBt5oMCFIAC7oMn2YAC5oBKAQEggiLrAQODTo2BAPmDAXeALCiCAAqAABSBTpcBDIBNGIBf84IDCYED5gEBgQuugS53AiIJgQLOgRlLgQAEBUkbC6ALgRwpgwlzgSoZhAlzhQl1ggIFiQlzAUWDAheBCXSAQJyAAV2AQuKCBX2RCXOCAmKaCXODB/WTCXOCCWyAApWFHAOCCHEDNgJ4hAVTgGUYgAIVgSJAgABPAWCBToiFAFABgIIA74EC3YIJoYQEdIUJpAEEgAmkgwf2gEy2hibRgh5MgAulgAH9AUGAAUODADWBAGeAVAMBIIEA2YgAbIIC3AF4gqObgwjoAQWFYMiAABiJB5GCBjeBA0KAAAmFCeiDCogBZIAP7oACT5sHx4BQvccJ7YEo3LQJ7QF4gR3fggkrhAF8gD9QgAeegACMgCjkgRsVglojgQDdgwahAaSCAPoCoC2OCa6AHeWEHbKEAiOBBQyCNMyJAh6ABZiVBc+DIGSLCcqCGiOECcsBeIQJy4MCE4IJvAFohQnZgQ5zgZHUhgl5AVyBUIeGCCoBBIUIKoCjT5oI14Kk+IAACgFohQWOggX+hAT38gnUhwm4iAlVkAmzggLUlAm2hANigQoOhgiahgoohgD6AQSCobKDAVWUAC6ABJiCqZ//ASGHASGCAgjoCouGAmG4CouBBF6AjxYDAAs/gg+agQAejxcghj/GlAAfgAAcglI2AgRAgAGUAQOAAA0CgweBN1qFP2KAENOAIiWBLjyATW2Al8aCULCOdeuFDu+BFfgBQYAjsIAAMAF/gFCoAQaCpL0CAEiAP46BE52BFj+CMuiAVRiCesqCBTGBNXiBF4mCBtyAF3qCkRUCCEmBIbwCS3KAFfOAUuKCBRCBdj8ByIAJjYFUz4MAcINePYNXjIEFY4KaDQJBKoEQioABX4IWuQRC//+BgmzZAVSAAAwDgICCgFF3ATeAW8SATlOBAWaACXmCVmiCFoOBAAyBWtqBCt2DVJiBAHWBI8+CAOSAAHeBVUSEABaBT4aJABmCAseCABcBTIcAF4JCFIAAHQHEgR6TgABegFkbgDjKgAAJAZyEMQgBKIEAD4AYXoQAMIEEgIFkuIAARgGcgSwPAQKAXrGAe+eDFRQBOIJXqYAE84QACAFEgks1gpMgg0Q6gAGRAYCCZ2yAQRSAeNaCB/2BAH4BiIEjhIALRQGEgQCOgCoZgGkkggpUATaCRV2BQzUBbIAFngE2gAQbg5DfAhA0ggHdgACMgBN2incXgACngY9Wg19ShRIZg0G7gAUngRpRgQokgWVJg0G9BEE5QSqBJY+AAdSCp0+CK4mBAv6DS0qCNWeDUoqACpeAS++BAGaAE6ODCCuEQ/oGQYgRNgK4gI+lgAALgB8IgBRvgo+xgHpvAayDABWACJaAALyBABUB4IAAFQGggwAVgAijgADfgQAVAX6CeBOAKpCDAL2BAK4BLIAGIoRbhIVEKIIoEgFEgDgahDK+ghZehQuBhkQhgiqgAiA3gQbcgQCrgG1ihQAShEQ3AUiDAReAMFsCDGyAGOQClCCBCVoBNoALK4EDbwJBkIQADwGMgwAPAZKEAA8BgIMADwGWhAAPAXyBDmACC0ODGVyBWjCXGVyCDWuBOE2CGVyBAAqAATmAeSgBSYIEGgMLC+OAjWKAAhQEC6EEaYCzYAVmZmljaYCy5QEgg7TZEwAxLjMuMS4xLW1vdGxleQBpbnaAs20VZCBsaXRlcmFsL2xlbmd0aHMgc2V0hgAcBWNvZGUgiQAZD3Vua25vd24gaGVhZGVyIICz0wFniwAyAmRpgLN3AW6AtAmKABYDYml0hABHECByZXBlYXQAdG9vIG1hbnmFABcHc3ltYm9sc44AGAJvcoYAU4YAJIUAVoKz9IAAXYC0QAFrhQCmAgBigAD4gACaDGVycm9yAHN0cmVhbYQADYoA1QstLSBtaXNzaW5nIIC0pwQtb2YtggBHgAAlAmNvgLQtAmN0hQDjA2NoZYoAF4QAmI0AFwRkYXRhhgAViwELASCBANQFZmFyIGKAtJABAIUAVwJyY4EAgQVtYXRjaIYAMgF3gLT0BG93IHOBtQOGATuCAN4DdHlwhwATiwGyggDQjwB1ggAWhQGvBGNvbXCAtSQBc4C06YACDgR0aG9kgDInEwwLpQIDAAQABQAGAAcACAAJAAqAKQcNDQAPABEAEwAXABsAH4CVbhYrADMAOwBDAFMAYwBzAIMAowDDAOMAgAY4ggABAYCMAAIBgYQAAgGChAACAYOEAAIBhIQAAgGFhAACBZAASQDIghjMgK1JggCEAQeAAIABDYAAegEZgCkpATGAA4wBYYAARgHBgEjqAYGBSOyAQBYEAQYBCIApDAMQARiABbwJMAFAAWABgAHAiQB4hQBwhQBoAYaAAAIBh4AAAgGIgAACAYmAAAIBioAAAgGLgAACAYyAAAIBjYAAAgGOgAACARCAAHIBEoAAiAEIggCAAQaAAQIBBYABBAMEAAyAAJaAHJwCAA6AAKIBD4CwMwQOC7cMtQEsgBzVggABARCMAAIBEYQAAgEShAACAROEAAIBFIQAAgEVhAACARDAASyJAICFAHSFAGyBAGQBFoAAAgEXgAACARiAAAIBGYAAAgEagAACARuAAAIBHIAAAgEdgAACAUCAAAIGoAgAAKANgACIgADQAR6AAAQBD4AAVAEggAAQAiAOgwDgAR6AAASBABSBAAEBoIQAFAETgAAEAQeEABQBDIABOAGMgAAEAUyAAAQBzIAABAEsgAAEAayAAAQBbIAABAHsgAAEARyAAAQBnIAABAFcgAAEAdyAAAQBPIAABAG8gAAEAXyAAAQB/IAABAECgAAEAYKAAAQBQoAABAHCgAAEASKAAAQBooAABAFigAAEAeKAAAQBEoAABAGSgAAEAVKAAAQB0oAABAEygAAEAbKAAAQBcoAABAHygAAEAQqAAAQBioAABAFKgAAEAcqAAAQBKoAABAGqgAAEAWqAAAQB6oAABAEagAAEAZqAAAQBWoAABAHagAAEgHm4AgC6gAAEAXqAAAQB+oAABAEGgAAEAYaAAAQBRoAABAHGgAAEASaAAAQBpoAABAFmgAAEAeaAAAQBFoAABAGWgAAEAVaAAAQB1oAABAE2gAAEAbaAAAQBdoAABAH2gAAEAQ6AAAQBjoAABAFOgAAEAc6AAAQBLoAABAGugAAEAW6AAAQB7oAABAEegAAEAZ6AAAQBXoAABAHegAAEAT6AAAQBvoAABAF+gAAEAf6AAAQBAYAABAGBgAAEAUGAAAQBwYAABAEhgAAEAaGAAAQBYYAABAHhgAAEARGAAAQBkYAABAFRgAAEAdGAAAQBMYAABAGxgAAEAXGAAAQB8YAABAEJgAAEAYmAAAQBSYAABAHJgAAEASmAAAQBqYAABAFpgAAEAemAAAQBGYAABAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.quickErase="no",this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.quickErase=config.quickErase||"no",this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),config.quickErase&&this.setQuickErase(config.quickErase),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),"yes"===this.quickErase)canvas.remove(obj);else if(this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setQuickErase(quickErase){this.quickErase=quickErase}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),this.trigger("chapter-pages"),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getPages(){return this.chapterDocList.map((_item,index)=>index+1)}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterSizeCache=null,this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; diff --git a/src/utils/reader/mouseEvent.ts b/src/utils/reader/mouseEvent.ts index 3a0467ff..100b920b 100644 --- a/src/utils/reader/mouseEvent.ts +++ b/src/utils/reader/mouseEvent.ts @@ -407,12 +407,21 @@ export const bindHtmlEvent = ( renderBookFunc(); return; } + // 阅读尺等辅助模式下滚轮完全接管为逐段导航,preventDefault 必须在 + // lock 检查之前执行:锁定期内到达的连续滚轮事件若不拦截默认行为, + // 会触发原生滚动与遮罩过渡动画叠加,造成动画掉帧(键盘事件无默认 + // 滚动行为,所以键盘快捷键不存在此问题) + if ( + readerMode === "scroll" && + Math.abs(event.deltaX) === 0 && + isReadingAidMode(format, key) + ) { + event.preventDefault(); + } if (lock) return; lock = true; if (readerMode === "scroll") { if (Math.abs(event.deltaX) === 0 && isReadingAidMode(format, key)) { - // 段落模式下阻止原生滚动导致遮罩漂移,改为逐段导航 - event.preventDefault(); await mouseChrome(rendition, event.deltaY); } else { await sleep(200); From fd15bdcab2ef8d980179bc9f5205db02e855e423 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Fri, 2 Oct 2026 15:45:30 +0800 Subject: [PATCH 27/42] Refactor sentence splitting to avoid unsupported lookbehind in low-version iOS Safari - Updated `splitSentences` function in `common.ts` to replace lookbehind regex with a compatible approach for older browsers. - Modified `getSelectionSentence` function in `mouseEvent.ts` to similarly avoid lookbehind, ensuring better compatibility across different environments. --- src/assets/lib/kookit.min.js | 2 +- src/utils/common.ts | 13 +++++++++---- src/utils/reader/mouseEvent.ts | 7 ++++++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/src/assets/lib/kookit.min.js b/src/assets/lib/kookit.min.js index fb5e73e2..7cd0b55e 100644 --- a/src/assets/lib/kookit.min.js +++ b/src/assets/lib/kookit.min.js @@ -1 +1 @@ -import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("FQBhc20BAAAAAUULYAF/AX9gAn9/AIEABYAACwIDf4IABwEBgAARAQaAAAuDAA6BABUDAGAAgAADgAANAQSBABUDAGAHgwAegAAfEgNCQQcABAEABAgIAAIABQIKAIAAB4EAAwEFgQAHAgICgQAHEAEDAAUGAAMDBQQJBAQJAQaAAAEeAAIEAwIEAgIBBAcDAwQFAXABDQ0FBgEBggKCAgYIgACYIkHQ1QQLB4oEHAZtZW1vcnkCAAxpbmZsYXRlOV9uZXcABw2GAA8HaW5pdAAIEYoAEAdfcmF3AAoQhgAUCXByb2Nlc3MAC4cARgZlbmQADhaGAA8QbGFzdF9jb25zdW1lZAARC4QAGYMAbYUANoMAbAEShQBYhwBrARSFAH+DABMHZ3ppcAAVD4UAFIUAfgEWhgBWgQB9AhgVhQAOjQB8AmRliQB8hQAOggB8AhoQiQAPggB8AhsRigATggB8AhwPhQAUhQB8AR2GAFaBAHwJHwRmcmVlAAIVhQAVjACDCgZtYWxsb2MAAQuCAFUKaWFsaXplAAAZX4AADxZkaXJlY3RfZnVuY3Rpb25fdGFibGUBgAAcG2Vtc2NyaXB0ZW5fc3RhY2tfcmVzdG9yZQAFHI4AGwJnZYAAbw51cnJlbnQABiJfX2N4YYAAWwRjcmVtgAASBl9leGNlcIIAXQZyZWZjb3WAACUtPQkSAQBBAQsMACEiDA8XGR4+NTg7CqHlAkECAAu/JwELfyMAQRBrIgokAAJAjwACEiAAQfQBTQRAQaQnKAIAIgNBEIAAEgYLakH4A3GBAAkQSRsiBkEDdiIAdiIBQQNxBIEAMgYBQX9zQQGAAB8GaiICQQN0gAAZDMwnaiIAIAEoAtQnIoAABgQIIgVGggBSCSADQX4gAndxNoACphEBCyAFIAA2AgwgACAFNgIIC4AASAMIaiGAADcBIIIARoAABQRyNgIEgQAPA2oiAYEATQMEQQGBABIHDAsLIAZBrIIAnwMITQ2AABuBAIYEQQIgAIEANQUAIAJrcoAANQQAdHFogQCjA3QiAIIAj4AAH4IAj4AABosAjwUBd3EiA4YAkQECgQCRAQKEAJEBAIAAaIMAhYAACgJqIoAAjIIA3wUgBmsiBYMAjIAAGQIBaoEALgoAIAgEQCAIQXhxgQBuBCEBQbiBAKAEIQICf4AAZQEBgAAZBwN2dCIHcUWEAHgCIAeAAD6AADyBAHWBASEDCyEDgQDpgAB2gAAchACEAQGDAAeAAJyBAIuCARyAAFYCIASAADmAAP6CAHWAAQsCQaiCAQkCC0WAAQkFC2hBAnSAAOYDKSICgQEuAnhxgACqByEEIAIhAQOCAagFKAIQIgCAAIOBAAoBFIAACgENgAB+gAEQhAAqgADZgQFuBQRJIgEbgAA2gAFJASCAAAmAATgBIYEApwILIIAAVAMYIQmAABaAAAkEDCIAR4AASIAACgEIgAA3hAHGgACxAwgMCoIAKQUUIgEEf4AByAIUaoABU4EAdwMBRQ2AANkOQRBqCyEFA0AgBSEHIAGAAZoDFGohgAIFggAwAg0AgADlARCEABCAADEGDQALIAdBgABbCAAMCQtBfyEGgAAfA79/S4IAJwELgAISgAC1AiEGhAD+CAdFDQBBHyEIgAH+ggDygALEA///B4ACxoABwQEmgQJYBnZnIgBrdoICpQpBAXRrQT5qIQgLhALxAQiFATUBAYEBngIAIYECCoEAB4AAPAEZgAAdAwF2a4AAVwgIQR9HG3QhAoUBSYUBNAQDIARPgACTAQGAALcDAyIEgACGAQCAAH8BAYAARAEDgQI/ggFoAQOAAdOBAtQGHXZBBHFqggDcAkYbgAAdAgMbgABkAQKAAI+AAWSBAO6BADECBXKDAIQBBYACzwEIgQK7gADugALPAgdxgQGuAwMgAIUB4QEhgAEdggHAgAFMiAHCAQKAAb4BIYAAbIEByYMBxAEFgQAJhQFTgAGTAQGDAW8DCyIAggByAQWAATkCIASDA02AAEGBAMsBBYEB5wEIgAA5gAAJhAHngAAKjQHngAKTgAAWgwHnAQWCAeeAAA+EAecBBYIB54ABK4ACeoAA+4MB54IDgIgB54IAEIQB5wEDgwHnAQeHA9gBBYEEgoMDQ4AEpoAAjYECnwNBEE+AAI2CA4uAATKGA4ECBWqBAJOAAFeFA66BA1WAABeGA7sBBYsEQIABX4AEJwEhgAHlgANGgQA6gQNWgAN0gQCZgQNlgAJvgABKAbCCAIgCAkmAAIgBsIAAH4IAgYEALAK8J4AAA4EAG4MAiIEAN4kAjYYEMYUAS4QCSgEvgAQ/BQJ/QfwqgAA7gABTAoQrgAAIgQJoBYgrQn83gABXBoArQoCggIAAAQEEgQAOEfwqIApBDGpBcHFB2KrVqgVzgQB6ApArggEnA0HgKoMACAaAIAsiAWqABaKAAZMBa4AEXIEEmQVNDQhB3IEAZAIiBYAAZgHUggAKAQiABKMFIgkgCE2AAUcFCUlyDQmAAvmAAEUDLQAAgAKQgAJvhQX6hADYgQA5BOQqIQCDAlqBAD+BAY2AADwBCIICagNqSQ2BAtuBAhKCAkMEQQAQBIAFdwJ/RoAB+QMBIQOAAMmCAR0BQYAAk4AD+4AGIYEC/AFrgQVTAWqCAs0DcWohgABAAQOBAKsBA4QAq4EBEYMAq4ADRQNqIgeAAHGAAUoBB4AAqwEEgAAqgABfgAFjBUcNAQwFgQA4gABMgADrgQAWggJCgABTgQCVAUaABP4BAoIDFYEAioABCQVBMGogA4EAuIAB7QMMBAuDAXGBAyADIANrgQCJBwJrcSICEASDAC6ABWWAAJaCACuAAJyAAM0ERw0CC4EBaAHggQCWAkEEgQWsgAWohADpggDygQBoAXKBBSQDTXINgANTgABQgAPoCAZBKGpNDQULgADOgwDRgQDPggGsAdiCAA4BAIECTgLYKoEDSQEAgQGFgwFxAQSHAXGDANOBA2uAANUCIgWAANeCABKDAWuBAMcBtIMCe4EBSoAAewEbgQQtAbSDAr2CAmkDQegqgQYwAQCAAFCCABUFQcQnQX+BAAgCyCeDAnuBAAwB8IMCQIEB4IMGz4MHsIAGUAHUgAMQgQZYAtgngQUngAC7A0EgR4AAeYEDAQQDQShrgAAQAXiAAOkBQYECa4AB3oMDDoQHoIIGzoADdIUDCAQCakEogQNsBMAnQYyBAXuBA+CAAc6AAYEBTYEGZAJLcoMA2gQMQQhxgQAKgAHZAgVqgQAwgABRgATNAiAEggBmgAhRggN0ArAngwOPgQFPgAAtgACJgwBvgAClggBvgABWkABvAQOCARMCDAaDAAeFAT0DIAJLiAE1gwH7AQWCAYACAkCBBpmEAYKBBPeEAXoDAQwCgQWcAi0AgQCtgATgAQuEAa6BCSyDAa4BBIECaYEHPIICjAMiBUmEB1kBCIIGTJQBQAEHkAFAAQeZAUCAAGICBUGAB/iBAEEDakEvgABPgAAoAQSABUyACZQDAUEbggksCUHsKikCADcCEIAACwHkgwALAQiAABSCCVuBAHCNAiCEAgyAACABGIAEr4ICE4AAmIMEv4AABQEEgQmQgADPgQL+AyAERoEG6YMFSQF+gAnDAQSDCC+ABnaEALaCCMEBAIAI8gMCQf+BCkOAAAiECQ+AABWEClCABSqBCd+ACQ0BAoUJDYAAEYIJDYIJgoEBNgELgAbDgADagQkNgABggAZ1AkEMgAWyAQiBBS8BH4IHMwH/hAfdAQKAB92AABmQB92AALGAAMUGNgIcIARCggEPAQCABzkDQdQpgAmaggTrgwg3gAKvgQo1AQOCAIoBqIEJlwEFgwmXggllgQCPAQKACAOAAFWCCAOACGKBCAOCB9aAB6KBAi2BCt2CB3wBAoIDqoAH44EHbIEH04MDDoAH8AIiA4EG5wEFggbngQBXARCBAJqAAe8DGEEIgAcEAgQigAgsAkEMhQoHgAHTgQDwgwCBAQiDAMOACNWAACMBGIABAgEMgAA7hAbsgQLygwRHhAapgAZkAU2ACH6AAmqBB8ixBquAAyEEoCdBMIEAOYEDMIIIwIMHFoIC14ADKIIDa4UCwwFqgAYZhQBCgAmMgAaDggAVgAUFAiAIgAbsA2shB4UE4QIgA4ELboED2YoDzAEHgwUbgQDlhAvYgAHgggfzgwAxhwrrhAifjgAxgQIlgwEGgQFAgAFogQWXBANxQQGAAD+AACSACiABCYEAFoACPYIM14MClIAAEYEIzAECgwwCgwKWgAwGgAA5AXaDDJgBAoEC7IcLg4ECd4EANQMYIQaAAEaABC+BBBqCAEWCAR+BACaBAaWAACaAAB+AABiAC1iACRMBA4IJE4IB+4EJp4AAEIEJE4ALh4IKKoAGiYEJE4IEMIAAMIADV4ELGoEJuYIAMYECLAEFgwkTggqKgACSAQaACaiDAGABHIAA5AECgAW2gQoGggEpgAF+gALYgwGrAwINAYACyIMC3oEA1YUA0oEAOwIgBoAAXYEAMAEGgQAsARCBANeCAAoBFIAC5oIMCoAI5IACl4QAtYEDXoEA2YADOoEAJQEYggEEggw0gQJFgAAZARSGABkEByAJaoALzwEDgAAHgQLtAQSBA32AB02GBCSFBNWAAAoCaiCBBPaAABKDAYwBB5MEIAEHrQQggwMpgQAHhAGxgAQoAQKBAGaEBCgBB4AEKAEHkgQogAFbgALUiAQogA8mgwQogg8dhAQoggS1A3QiBYUEKIAD24MAkoYEKAEHgAQogAUHggQoAQKEDCuCBh6DAfSBDnaCBCgBB4EEKIEMC4EB7YML+4EFfYEEKIMLQIIB/IYEKIAA1gEYgAAHhADkgQDyhQEEgQZ2gwuPgwQqgQIvgQAriAEIAQuADLWCA9qCAgABCIMCQoAAZgEcgADQgADOgAJsgAJCgQ8KgACKgQJCggNdgAbvgQDiAQeEDxmBAa+DAECACgCEAkCACgiEAkCCAAqAAkCEDkoCIAiBAISDAMiCC6mAAIaABomCAMaFDC+BAkCCABkBFIUAGYAAXAMEQQ+DCmMBBIEEqYADi4cLuYMEfYYEIYEMCoQAH4AACoEEb4QAHIEFXQFqggGPgAASgwJegQFxkAJeAQSiAl6BD3aAAByAAAcBDIECzYMAB4cCXoIAZoQCXgEEgAJeAQSVBoaCADwDHCADkQaGgQMaghC1hQJYgAK0hAaAgQelgwBxARiBAJgBBJYGh4MCX4UP74AHo4QGh4IJHYEAJoEF8oECXwEHhw9VgQBeARCDEGiBA9iFAOWBAPOCBvSDBN2CABaDEH+DDaGABBuDBPKCANSBDgGDAl+CBPoBCYMCX4AAPIQCX4AB74ACX4EFZ4AAKI0CXwELgwJfhgJdAwIgCYQCXQEJhgJdggAKiAJdAQmBAIKDEEyPAl2DEHOZAl2BC/uKAl2ACXaNAl2ABQKEAB+AAAqAA5KGAl2AAm6EAl2KEeaBDjqCAYWAAmGGEeQBIIMIT4gR5ogCW4ABO4ICRoMB3IEH6YICW4IB8QEIgQb/ghHXgQ6ZgQBugQiAgQFjAQuADg4DEGokgABKBgveCwEIf4EGz4IA7AJBCIEMd4AJqAFrgwLeAXiBCzQCIQWCE5QCAXGBCa8BQYACXYEGgIEFv4AAIoAAL4MLB4AKo4ISvIME6IAE6oQHeoQG3oAHNIAAPIQJxoMG7wEEgA0ViQcygBMMhAcygQ2YggchigcfiwdFgQ3KhRAwiAcdghAwgwcdAQSAAsoBBIISF4IHHYABhIUQMIIHHYIAEIsSF4AIo4ACZoAJQ4EH9QIDR4AOUIABOIICZ4AQ9oQGf4EBHoMBxIIUbQIAD4QF8YEAmYIFUIAN6Y4HYoICwQEEhwdiAQSWB2KJAsWrB2KBAsWCARyBAsWIB2KCAsWCABmBAsWFA6MBBYQRmoEA7QEBgAHShhW7gwHigglggQHAghTZgAlrggvlhglrgA1IggEXhwENAQODAfACRw2BEXGDEE8BuIMACAEPhAmFgQ/4hAmHggBNhgmHjwBNgQ2YhQFdgQKEgAAjgQw3iwJGghJEgAF7jAl4igJGiwGagAIzghKMgQJXAQWIEoeJAleDAgOREoeAADS0AleAAg2RAkCGAOaDDlmHAjOHB1ODAjOCB1OjAjOABsSjAjOGB1WMAjOHB1WOAjOOALiAABQBCIAPz4UDJYABrYULFIELLIMWt4YHKoAE+oILFIAUhIUEz4AG9I0WtYQGq4AICIUGRYIE1oMGIYACSoEJh4AAZYQHKQEAgAcpgASzgAcpAQGDBymAAsyGCYeCBlyGBymGCYeAEzWAAucBf4sJiYMXSIIJiYMFYoABqIECpIENJYMJIpEJj4ABnoAVnYECD4YNtwEAhgmPgQzagxWKgAG7hgcwgBXRhQcwgQBdgAu9gAfpgQD3AgMihgEGgALVggD8gwEKgAAngADjgRRhAQuAAnWBEF6DBjiEARqCAY2CD/qAEZoBxIICEoAFlIASTQIgAIAPwYATTwSMCwEHgAANgQWagAXHgxBjgRJ3ggXOgAEWggXOghB3gACOhAhIgQAmgRKBhAaPhBC7AQyABm2FD4mAAZGRBcOBD4mGA32AACKBA2yEBgSCADCCB/6BAc+BGJmBA5CCDLABBIADbIEV04QWVgEEghaZiBXzAQeAAWGBBeOAATCCBNKAAUWCBeODABCFAVWLBcOAAIqHBcOCDuKAFD2EA4OBBsaFBcOBABuCBcOEAJmHBcOAAEqEA5CAAJYBHIAAUYYDkAEAhwOQgwlXiwOQhBqPggOQgA8VhgOQgQH1gwOQgAAKgAOQAQOCA5CABeWBA5CCAPoBAoIBWoEDuIMJKIADd4IBIYADuoEB8YEDx4UAGYYFr4QA7pEFtIIFhoYFtIATf4QW1oYPsqkFtIIAH4YFtJAATYEauIQBToERp4ICTYMFtIcCN4QFtIIPj5UCN4sBi4cFtIAGtIYFtIsCSIUFtIECSIgFtIACSIUFtK8CSIIFtI8CMYYA5oMFtIcCJIIFtIgCJIgFtJ0CJIkFtJoCJIIA1pACJIIA/ZACJJEAuIENVYQFtIQBrYUHUIEHaYIFtIAcY4YdrIEVzIEFtIAII4UM3oEK0IAEHoUL2YEM3oMQsoUKfIQQx4MKmIIFtIAErIYFtAEBhhtAAQKDBbSBBSeCBbSCEiGAALkDHCAAgwW0AQOFBbSAEW+GDzuBBkiAFmWGBbKAEAWDAJGEDBCCBq+CBUuABbOAAMGCBbMBA4MFs4ABH4EFs4ICDoEBqIIFswEBgQWzAQOBBbOBAAeABbOAAnqAAJWGBbMBAoMFs4QQu4AClYIBWYQA6oMGl4EGCoYa0IMTZIADXYIM4oQTgIMBDQMLC0mBBxEBkIMGe4EVGwFqgQtiAQKCCzWAAHSCA1CCF4UDIAA/gAUCAXSAHo2HE0UBf4ABTAGQhAqQAwELBoAALQYkAAsEACOAE7MCAQGABtUEQcQAEIAQGYMLyAIEa4EZj4AMOoIADoAGHgMA/AuBGM6CBWuAASMBJIEHjQU2AiAgAIASGQMLCxGAACaBAVEBfoIHxQsQEAkL2QIBA39BeoAHMARAQZQIgQBNATGBAjgBfoEcBYQAVYQEuAEggwJ8gAAKASSEAAgKKEEBQdg3IAIRA4AGVoEAVwF8gQBXgweQgADmAzYCOIUBrwQCQb/+gAAJgABlBCAAECODFg8GQR91IgNzgBlXgQKAgBQFgBYugwLSASiDDnwCdkGCGfoEAUEAToAeWYEfa4ABYIIAPYIAXAM0IAKBAj8BLIkAFIAA54EAB4ABloEAG4AI1YIN8YAAX4ADhgEwgALIgQAWATyDACsBJIAAB4AbNYIOHAFCgRtAAXCCCD8BQoAAqAE3gQ3IAkKBgwAUAcyAAOCAACsCtAqCCr4BcIMA0QFUgwAHAlBBggkNgAEJgxmBAyQRAYQBMQEcgAIsjAFtAXCAAW0BEoIB+oEA5oIXlAgEEA0L/SQBIoQhWQIUJIEBeAEZhgEkgQeMAiIShAFsAwQhE4QbV4ECNwETgARnAwAhE4IAfYEEkAHcgAs6AR+AAKcF9AVqIRWAAAgB2IAAEAEbgAAIAfCAAAgBGoMAvwIhFoEAIIAAEAMRQZyBGBkEIRxBmIIACAQdQZQrgAH4AiEegQM2A0AhCoEABwE8gQr5AUGAGDIIAkkhIEF9IQ2AAA4GBkchISATgQIYgQMvAxchEIEY+JEiCpIAAoEJjpEiNoEQgoAiGoABdxdrDhMEBQYHCAkDAgwNARkAGw8iIhQhIoIEfwVMIQYMGYYACoAW0IAACgFsgR5MgQAIASKAC9YDKAJggh8wAwxJG4AAIQQGCyAggR/agABWgAZSBA4hDQyAAZGBBMYCDQ+ADxICCHKAFeABCIEEAIIXjQMKQQKCBrQDRQ0OgRqIAWuBH5KAARADIAp0gBR4gRSggBrSgAAtAwkhCoMgzoERfoACUAMIQcGAAF6AAtKGAMuAABgBdoIWRwZrDgMAAQKABOgBHoENdIIfmAUIA0BBkIAKBoAP7QGQghokARGBICIFdGpBCDuAAjSAAAuAIFiBAF+AACcCgAKAH0YBBIAAB4MAJ4AFCYAAJwEJgQAngAALgArZhAAnApgCggBOAZiEACeDAE4BB40AToAANAGgigBJggBwhwBJgSB3gAIIA0GgK4EEewKgPIMACQMgFEGAETYBDIAFgwERgAA/gAAXgAARBwxqIBUQJBqCAFMBIIkAUgEFjABSAZyAAE4BPIECqgEcgwBKgBCZAQyAIJYDEUEgigBJgAJ2A0EBOoAEcASgKyEdgQFXAR2AA1GAA3gBiYADeAHQgAOEAViAABOAAEKAA2sCQceCBDwCQQGAAqMBIYAKNAQKQQNrgAKngRXuAiEHgQAdgQg2gSB6gAERgQHsBB8LQcSBAZuDC9ECwguBGTQB0YEAEYIcR4AASoERF4gAQ4UAPQIMGoEAGYAX/gEFgAYIAQqAGJaAAByBGa0CQR+CE66CB+mAAh+AAXaBAh8BBYQCH4MBboMS1AMFDAKABWeAAVKBAhsBBoAAVAEKggCRAR2ABZOBCHID//8DgB6CgAAJgCT3AhB2ggsuAkHdgxKfgQChggqqgAJmBBoLQcKCAEABAoEACIMSVoAE/gFEgABagAi2gABUgQOMgAQWgQBbgACzAwJBw4IAJoIC4gNEIgOCCDmCFNiAG+ACAyCBE7EBEIEACoECiYAAKoQDEYAAOQESgBWIAwMQJYMjmQFEgAWJgABkgAAtBBJqIRKBADYCayGBADuAANaBGlCAAA4CBAyBEzCEBckCDBeACNOCAz0CDUuADFmNAR2FAzyEAR2AA3QBaoMDP4IBHoEBnoMAhoEAUoABEAEfgAEXA0GBAoAaKQFkggAQAgV2gAATgAA7AzYCaIIAEAUKdkEPcYAcVQEigAkgAWCAAE4BDoMBvQEOggG9AkEegiHeAkGhigFKgAChgAAMAcWDAjoCACGABCOBBZgBbIADE4ADqgMGIAyBCpsBE4AACQcGQRNNGyEJgADLAwYgCYIN1oAAE4EhHoAALYAC44AADAV0LwGwDoIC6gEAgQLqAQOABGABAIEHZJgESQEKowRJgANhgBrygwBpgAAMhgBpgADbAgdxgQBsiwKnAQSAAMaFAquDAEEBFoMGi4AAB4AGmYEdgYEDNYAADoAGmYADcAUTIBogG4EDbAIiDoIBIQG/ghdnhgEhARaBASEBxoQCYYIBHYABKAEOgQ6AggJKA2QiD4EABwRoaiEMgADcAQuABVqAATKAHaMEKAJYdIACwQEhghVUA1AhIoABAQEJgACbgAOXggEFASKAAzwCGHGACdIHaiIjLQABIoADBoAfOIEK4YEWDoABFYABAYkDPwEJgQEVAQmFAz+AANeAAZ8GIy8BAiIIhRV/gAj3hgEmgAAMgAEfggTEgSPbgQEcAiAGgwEcAQuBFlABf4UGaIACegQQaw4CgAWHgSOUgAl6gg/AhgCMgBAwoQCMigBlAwUgC4IJsgJBh4sDswEJgAGTAQOAAvmAJpuBBmeAAgaBADOAJYmBAJiAJE2ADqCBJp2BALsDIBFqgAAeAi8Bgg7AgBYzjQCXARuoAJeEAhuAAJqACyyDAiCAAjaAAFSCDFiACnOMAFwBGqkAXAEHiABcAQeDAFwD/wBxgCc/gCeGgQIiAwQgDIAAKQILaoACFJYBEYAD3YEFPoIGKoMBuAEEgQG4gQHPgAJigwMhhALIgAWjAWyAF7mEADiCABQELwH0BIMBbwKUCooCtwEVgQK3gABxhQLrhAMAgQasAiAPjALyAaOLAvKCADuABEMBXIME8wFwgAM+gQaZggLuggChgQLwgABDAR+IAEMB8Y0AQ4QGcYYGloADNIQFkYAACwENgwBkAciFBZGBA1cC0DeJAzeCA1UBUIADyosDNwEMgAFugATjgQM3AQuLAzeBJuahAbgBC4ADNQIhD4AC+oAAQIAp14ELUwX/AXFBDoEARwMGIQyAAJ0BBoECGgMMIA+BAGYCIRiAAJUBBoABwoIAlYIBqQIgGIAAhAELgCgPAXaCAIcBD4EAhwEMgBjPgQHkgACIgAR8pwMzgQdCggOYgABGAQCAAe4BD4IAnYEB6wEPgQZlgAVkAiAMgAXeAtA3gAAvAQyDAmwBDIEALwELgQC0gA/SgQP5AkHNgwFzARGBGscBIIEmEYUGfYAACYAknQLQN4MAGwLAAIEAHAMAQdWBB+mHAaqAABwDAkHJhQdAgBnNAXGBBj4BTIUCZoIP0oAGoYoBhoAAvIQA7oAIUqIA7oICSYAAxwEGgwDOhAdLgAfiAiAGgQFagA5dAQyBAPGLBK2FAumAKDABEIMKHwEQgQDthAcUARKBB5qBAEeACR2GAkwCIBCBAI8DECASgQCCAhIMgh3lggebAQqBHJiAAdABCoIHWoAFz4QARoYAIoIAGIAHCIQAGIITBYUAGIIAEgEOlABMgAE8hAA0AQ2AAk6AAAeBC3cCQdCDAI+GCSGDCTIBCoQrvwJEIYIik5IAUIAAyYQAUIAA+AMCQcqFAZuAASEC1DeAK6mBAEABXIMCj4EACwFUkgMkAQuDAySCAp2HAySAB2miAa6CAoeBBmKBApcCIg+DKhiCAcGCB5SAAGIBC4gDHQEPgwMdAQ+GAx0BD4YDHYIDpIgDHaUCL4sDHYUCO4ACGoEDtYAEHIIDxYAAiAEhgAzCgQMlAQqFAyWJAj8BD4YC8wHxigLzhgJYgCsQAwJBy4UBYAEPhgL7ggVpAUiHAwKIAV8DIAYEgybGhQMBgRnrtQMBAUiJAwGBAHKSAv+BAKUBzIQFKYYDB4AAEYQCJQEGgAfOggBNgArEAhcggA8fAQmAAe2CGy4BCYEcvIAAGgEwgCS5gQAIAsw3gxCpAfyLBikBB4QAQQE0gCrEAQOBANaAAAyAEJEBKIAQM4MARAFrggcrggAWgAAiAWuBBtyBE1qBC0WBFIcDBkkbgQAgARKBCvyCLo2AABeBHYmBAZiHC1cBCYILNgMJIQOAAT4DEiAFgAEtgQO3gwOngQblgQf7gQFKAiIDgRJgARCAAHmAA8aBAE2AAWKFA92BFP6SAzOAAcSEAQ6BDLSFABuJA9mAA0aEACKACFKIB0GIBA6BABaEDIqBEZ4BEIMS4QEShiIFgRQ2gAblgRF9gAFBgQlygApJATyHD58BLIABXQQQIBdGgAhVgAP9gCmBgRG8gBgSgSYJgAARgCsIhBCHgBVdATiDBbyCGDeAEh6BFXACKHSBGhKAEj+BEiaAAG8COCCBFbGCHLUDLCIFggAugRGXATCCMO+CADCBKiICLAuDAfWAALuBA6QBBIEBXANrIAWADK6CIFMBNIMemQEsgBHXgwRwgAANgAHoAWqBDNSAACeBAd+AASWBASkGSSIJGyIEgAA4AQmBAGqBAeyBDPeAKH0DBGsggQAXghaAjABPggANATSAIhiACoWAARyDAKsCCUeAGWmAACmAAniAAJYBCYEdWIENZ4EpH4ASW4IRpAIIIIIRpAEEgABcgAAWgRrdAReDES2AEuSCLQUBFIAAF4EVt4ABVgEgggA6gBKxghF2gAPSgRpygABDBBtqQYCAEdyDERiCEMIBRoEAE4ASrYIUOIEOEoEwBYEIfoAAGYABKQcgDUF7IA0bginVAQ2AAJMBF4AAHwENgACZAROAAAiAAagERhshGYMokQHSgwiwAnwhgBFJARSDIBcGGQuUCQEMgBQrhhKngAEhgAjQgAAHgBMngAM0gANCAQ6CB40BEIIatwMCQUCAAY6HJ++CC3OAM+kBAoEz6YEozoEz6IAEwAEOgSBggCGaAQSABWSABh4BDYEFcoEUpYAASgELgADJgSBEAQuADc8CIA2BC+IBCYAEEwQNIAtrgy1rgAmIAU2BLUWCF5sDCSANgAx/gQjUgwArgQAngAGUARCBAEEBCYAAFQEPgBFgAnJBgSOIgAT9gAjNgCFFgCFNggAPAwwgDIYho4AEeQMIEAOBI4GDGTmCDf2DGS4DDWoigABVgABykwBQAQiDAHOEJoqBKSaFK36BAzKBAFKDIP+CAFKDGTOAAFIFCCALSQ2BKDyAAAmBAD2CBmeSAGABDYYm5YACU4EAOYIm5wEIgSUzhCssgyLSgQA5AiAIhQA7ggAsAgcggBa3hzCagRAagAeogBnCAQ2EIgmCJYOBBtWBAYiAMqwBcYABNYEigoEAooALkoEBRIAABwFrgASngAAiAwwhCoINNYMYJIAAEQEIgABhAQqMGcCBIqmGKOyAAB+BBEOABdaEI/+AADUBGIEUFYAAEwEMgRDchQBFigAmgAAfgAAYAxQiB4AWoQEMghnEgAAPARCBM4gBAYAAEIEZxAENgAVJAQ2ABLMDByIKgRnEgAEiggAwgANvgSLMgAAQAQqCADGBBU6AA56EAYaAERaBBkWCGaOAAFEBHIEA8IAYPYIZo4EBnIABZ4EZo4AAjIAAR4sZowEIiBmjAwwgEIQZowEQgQAsghmjggAKgBmjAQqCGaMBCoEFQAEYhAC1gAAoggDZARCDAQ2AEM2DANyBBo+CABkBFIYAGQESgw7OhAHKARGHAgUBEYsByoMB75ICigEShALajgA0gAIQAhIQggX/gAf5AgcLggCYgCi2gQbegQRJgBgtgSVlAxpBfIArbgEOhCPzgBBTAnEbgilIgQBMgRD2AwdLG4IAOgYJIA4gB/yAOmaAA8cBEIADFwILIoEEAocX2wE8gAAHAQ6ABceABA6AAC6ADPwCIAKDAC6CBk2BBluDF6qBACyBBluBBFODGbKACAYBEYEk9YEAHIIFKIAHO4EF24EFI4AMrYAaOYEf2gUYdHILCIEE6gUFEBALS4AZSIEXDgQEf0F+gh43gCExgQZmgQB7jRd4gAAdgDOcgwAXggZyiBePgRj8AR2JF48DIAERgAengQCcgADkBQAQAgsQhAAehBfSAUCMF74FDxATC9KBGSuHJUObGRiBCQyhGRgBtIcZGAEmgQ5DgC0QgAEFgApqgAYFA0giBIATuANBD0uCGwwDQYH+gAVDAXKIGSaCGR6CGSgBIIEAKYMZIYAARo4ZIYYAFI4ZIYAZXZ0ZJIEbaYsZJIAAtIoZJAHEtBkkAkF+jAFmAXGAAWaLABIBH4AAEowZNgEGgBk2BIBEASOEGTYBEIIZNgEXhQFCgxk2AQyEAYqEGS+BAm2GCKeCB1oBA4IHWoIOVAHAgwcYgAAHgRybgRj2AiEdgAAXgRlTgBkTghlTgAe0khlTgRlrghlTgxk7gBAWgxk7gggFARyFGSsDDiESiRjzgRSCgBlTgiGmpRknwwACgAHmgAG7A2sOH4IZZxszNDU2CgsMDQ4PEBEDAhQVASQAJhcYBD4/QEGEGWoDCwwkhgAKgSRZgBlsgw5aghl2ghopgxl2AQqBB/aBDkmAABIBDIAMGQEygwAKghZ0hgFiAgwzgRBnAQaDBQmACgQBN4oWMgEGixYyAQaBDGKBELGBEP+AIPWABKsEn5YCR4E45oEAWwEogwBZgBBNASiBBf2ABMKAHPyAAAICECeBAwcBHIAPLoAALgI7AYEpLwEQgABKBEECECeCIJ8BtYgXUIAEFYAAYgEzggCrASSBNr6AAlyAEFeAAwSABT0DdEGAgANugi39BWpBH3BFggMhggjBAwBBuYsMaIAAQgEHgRafAQiDF9EBh4AO0I0AHgIEdoEDxwNxIgmCDTiADUYCB02CAMYCIgqABwcBCoAMXYEpvgIoIIAhFgQFT3ENgBaXgAWmgjq4Aa6LDeEBA4AUYwEyiwFGATakAUaCC9aABpCCEhWTAKuAAbYEB0GAwIE9nYAAHQHYixL5gwHTASSEGF+BARiCBDKBNo+BADaAOBGBBGSBNOyDAAuAAXcDOgAIgAc+gQArAjoAhDv/gQGagwGPgh0kAwJBtoUTRYEIwAEGgwDbgxlvA0UNNaUA24gAmIEOToEMtwMtABWCJPSLAJSCCIaKAIoBBIYAigG3kACKhQFlgAwMrgCKgAD3gyK8ggFzgSAWmQCYgQKskwEiAbiLAJiBACSAPBsDQYAIgQGnAQeCERmFAKmBAASLAKiABLyAL4CKAKiDGqKCFq4BNoIamIICfYATlIEAvIENJYAP34EI8YIDV4AAaIEAo4AFvIUArgEogACugBvykQCuAgwohQECgQAngg2oARCAABSKAdQBMqcCr4AICoECWoADh4ADj4A8y4ECc4QDlQQYdnJygwPpgghuATCAAScBvo8BJ4EQVYMIrYEIloAC7I8O8YARF4UO8QRBAiEXgAEShgRKASiMAGGDFHsDCyAdgB8UAg0vhB5PgRohjBoGgBhuhBoGAQ+KGgaFAOyGGgaHAOmkHk+BHkeABjsCpDyAAE+BDG+BHWWCD+7/HlyXHlwFqDxBsDyCJqEBzYAABIEACoACM4keXYAAGIAAEoAeFQMUECmgHl4BrIAAUAHNggfagikfARCJHl+KAEuAASiCHmCBAdIBqIEBK48eX4AAQoceX4MXxYE7jIAR8AEGjR4bATKfHlSTADkBKoEAGYQeVIAZlrceVIAATgMGDDCpHkoBBoEAfZMeRAEGhBizAgwtnh5AAQ6AAAoBDoIeQAINLIANIZIeMwEMgA+mgQApAWuAEDyLHjOBBBOFHjMBJ4MEC4IPyoAECwErqAQLkh4hgTmHjx4jgAGbAWCAAD+AHiOBAYyCHiMEBUEeSYEl+wFNhQfBix4qASeKHiqACNeIHiqAFZqDHiqAGWGCHiqDGCcBC4MeKoIcm4QeKoEa440eKoBFTIEeKpgEJIAbR6EEJAEKgQBpgAS0gQBpgAAMjx4qiwJ9AQiAAMaLHioBFYMLkYAAB4geKoAADoALnwIhDYgeLoADOgIiFoIBJYweLgEmkR4ugR5DiR4qgQHhgBGrgT0piBrzARODGvMBGIYWcAEGggEFgRdSARODF88BGYEXT4AdNIQXz4AAvaQeKgEZgR4qhjOpAQ2IASaAAAyFHHIDBSAKggEcAiAKgwEcAQ2LHiqAPQqFHiqAHbyAAn2CAeIBCIQXCIEUcaMX2ocAZQMFIA2eHiqAFOGAAgaBADOMHioBBIIAu4oeKoAgB40AlwEkqACXhAIbgACagBEXgwIghx4qgBnHjQBcASOpAFyAHiqGAFyCHiqAEkSEHiqAA04BC4AA8oEVnwENmx4qggglgQUNhQG4ggZKgQHPgBHwgwQmhALIgBLdph4qASWIHiqBAuuEAwCIHiqHAu6MHiqCADugHioBHogAQ4weKoIAQ4YeJAEWhx4kAwUMK4keJAQEQQZJgBGXA4ICSYIM3aYIsIAFjAIOaoAFFAFrgBo3gQV9AhJrgSgDgRaRgQ7CghaJAxwiDYEXF4ADkoEWwQQgaiEhgAOXgAAMgxtmASKDAA2DA6QBI4EACwFUgAOkgAAHA1AhGYEABwFAgQLIgQ7QAQOBAAeBFheAAAcDMCEkgga/AQ6BA3KFBrSAMJuAAAuBPrgCCGqAGKGCRckBcoIKeYEDTwILIIAroQIgI4ID6oE9DIRBLwEGgQP0gAzngRl0AgR2gQQWgRuUggHKgBtZAy0AAoEZSIEjIoAcU4ADBIADpoEK8QEGgRshAQmAEhWCHdGCAC6CBO2CA9OBEB+CAJiBIYCBAt2CBk0BCogAqIIAnAIIaoAAT4IAeYABAgEEghqmgTyKgBoEgACJgTF+hADfAQqGAv+BAAuGAN+BHPOAANiBIeOBAOYBC4IEyQEihADfhwDbAQiDG+kBCIEDFIIA24AWuIFK9wF/gACWgQC7hEUegRt/ggOIiQNsgQXvghDsgD8SAQOAGuYBGoMAgQEDhAAfgS7tgQA4gACHgQNhgAC3gwBsgwFHgAEighuAgwDaAWqABVgDDCAfgBjwgxs/gBo+gRkcASSBGzyAAdABxIEbPIAbOoAGaoEdGYEXa4EBVAMOICCAACiDB4KAAIkBC4EFmQMOICGDABSBABGAAESBIhaBGQiBLWeCAbKCGvqDAbKCJUSCBpCBQrGBFawBDoEaioEAfIAUzgIiB4AXcaIANoAWOoEEYIAANANrIQmBFnYBDoEET4EAhYAAB4AUuYEZh6sASYABKwEJgQRuAwlBA4EXlogAOoIBtwE6gAFnhQJ/gBT9gQU7AQmAAFWAAjqBAFWAAAeDB5KAFVGAIMKGADwCCUGAQciAFsuDAq6AAJyCAG+BI4ABDIAcS4AAqYQAKIAADIQAZIIACoIAZIIAVoAuT4MF/IEAcoAQJwECgEqvggBmgAJNgQAqgAA+gAWPAUGCC26AEB2EAGaAAOEFLQAEOgCAOqGAFASAABSAAo0BCIMeHYAeG4EBAIId3QMIDB+BHsCBAhmBAqWCAh2AEOGAAh2DArSAANKCCKeCIUuBAf4BGYcALIcDI4YALAELgQnQgiGTAw0cGoAhdoAAFQEbgQDyhgE/gQMegCAsgBsOAU+AJNKAInGBRAiDKKqABPMByJEjD4ADpIoIHIEeLIQjDwENgQNNgAZtqwgcAiANhSMPgABAAgAigAZLiCMPAQuCHV+BJjGAAGmDIw8BE4AAlYAANYMf8oEYgwEFgBvMgBqYA3EgC4gjD4AKDoUf8qUAiIAKLIMDnQELhiMPAQ2PIw+BAFmBARuMCKwBDYIjD4IUw4YjD4Ao2AEIkSMPAsg3gwAblCMPgikPhiMPggSDgAAhiCMPgE4JgQqjiQGGgAC8hADuggqTpSAOgADHhADOiCMPAQuFBI6DIw+AARWBAOaCARWFB86AAjQBDoEPNoItz4si/oAK7YEMXIQDYYABqoIUX4EePoIHUQEKixBlASSkDFqAHwYCIA6CPQmMHZuBRLMBIIJFh4AZO4EHXAFGggecgBHOgSDHgRD4giJGgRGLgQJPgAG/AQODFGGCAJaAADeABK2AAl2DABkBKIEWV4MUcoQQToID2oARQoERQIAZyZwQ6YIAZwIbRoAAMQMAQeeKCOKABVUBEoEs7oMmkIAAEoEWqAGAgAS3AXSDACaTEMkCvf6CHleCE+wCAHGBR/+BDhUCDB6GIISABHKCIGkBBoEBaYMAFIAAZo8AHpEAMoAtyo4AFIISxwHOhSQ4hA8Fgw8WAQaCLAKBJDgBCoM3joMOnYAA2IEANAHPgwK7gRZ7hyQvgAECAcyLJC+CAZIBVIADV4sCvoAcOgIgCogkL4cERKQqioMDp4EdGIwkLwLIN4MHGYAcjIgEPYokL4EEPYAZxYQEPYEHvoEeaIUEPaUAgYsEPYUDW4ABIYEILoAFPAEKggChgB0vggN7gSfPhARFiQNfniQvggFgiyQvggQbgQ53gRBpkiQ0gAFkAiALhCQ0hQQmqic1jAQmgyQ0hAQmgyQ0iQDFgQ03gACEiSQ0AQ6BNTWAKX6AAMCHJCqCA9GBAeiCJCoBBYwkKoII7o8kKgEShiQqgAoUjSQqgQBEiCQqgAAiiiQqgSIugCD1gyY+hyQqAQuDJCqBAB6FEUGJJCqAD/eLCLGOJCoBDoEkKgEOggBNgAUThiQqhie/iANggSkGjQAUhyghhwAUgAA8hQHzggT9gThtgQEDgSvPgA1nggFVhgx4gRJ+AgN2gCFugx28gAWWAWuBEYEBIoQMngETgCNogAh0gROFgQA9AQWBTJyAE4qBA3aBCDMBBYIByIEMposbGYAABwEEgQR9AUeBBP+EBraAQr+BEt+DJKcBBoFUmoMVwQJBuYcSlwEUgAkUgxbyggFegUXxgSzagBKWggHqghZ2gB+hgB93gRtxAQ2EAAoBGIABnoAABwEUgQHEAQWBAgOADNGADKuAAZaAJEyBGriAHTkDC0sbgRLQgAAmgAoYgUSQkBjMhBbrgRL7hBeWhRL/gQD0AUSEEuyEEvqAAF2AUSqAAL8BuogRLQFEhhf9gQDFgQa0gQaohA93AWqBA80BA4UAx4EfrIFE1gEcgVWbggK2AUSACHiAABEBIIEkc4MSC4EAdYEIMwIgA4IU4YFRyoECQYEBGAJJG4ACPpYYaoYAygEFhADKgQB/ghOugA40gADCgCDkgimehBfGgR4Ygh2qgADGAbuSAM+BDNOFAM+CFNmVAM8BJI0AzwEo5ADPgzYliQDPgRzVAkG8iQJdAQWBAfWCBM2HGfSBLvSgCEWDAJyFAJGAAuIDLwEcgU7wAwBBmosJgYIXwIcYnYQaKAFBgDowgCb7gADwAQmDG1GAEhiMHMyMGIKBBGqAFDmCBGgBFIAACIoI+oJGeqAI+oEIpIEjc4IDkgEggVLLAwBB0IoFFYIApYAF6YQXyYIAuYMHo4AAGwEWgRaWgQCpgywOgSwfgUAJpRC7hBN5gQVhgTTHgAlfgVNMgySngShjhyhiAQiBCvaAABCJKGKCCw+WKGKAAG4BOIFKtIUoYoMokI0oYoAAmwEsgQG7ggYvgAbRgQfZAQiABZaFKBWQKGSCKAcENCIGaoAAJwEJgAAngU8ugCWJgSWNAUmBIagBCIAAOIESw4IoZIAAI4AFIYAQBIAmeYEoZIAAlpMoZIFO84AC74IowYsoZIIPXIsoZIAE3IMnnQEEgQGFhChzgEyChShuggDOlShphQKmhwrPgSEqgACmgwq4ARyBWaKDBweBCtSBEQ0DCBAngySPgQALAigLgQFbgQKOgAAHgijxgQXauSi4AQWAKLgBBYMouAEFggCVARuCS8kBHIYouAEXgwJkgyi4AQuAKLmADMQBEIMouQEXgyQjAQeHJCMBJsEkIwEKg0DqAw8QP4UACwFxhwALAR+AAAuMIosBCIAiiwLXJIApQoEhuoFPOAIQNIEiQYArJAIAGoIC44EBY4QiiwEcg03ZgFWegwCZg0qfgQDqgwE0BQRBmgVHgCtdgRpgAYeBA4uFKZGAJteCAx6ADEiAAHmABDCAAXiHA0KBAa0DABA2ggApgwcfgAIdgwE5gAdfASiFRpUBBIBWdYFFNgJBd4MkNQJLG4EP3IQAEAcDQQRKG2pKgAC2gBBCmCI/AwRBKoEQgYIAqoNEToAEcwELgTCxgAB3ARiDDqYB8YIEpIMwDgMwQQyAIUgB8IEY4IEEOIMAsQGIgACHAUqDBgoChAGAGdYCAkiAEoEBwIEIAgEDgBUKgAAMgAJHAcCBUPkBBoACA4MbX4BPNoAAKQIgcoMJdAFsgSUUAh9wgEChBEEfcxCCCGIBbIIX/wQALwEygQAQgQAJAzAQPIEBSYQNAoMFQIIAm4IBLYEBOIQEc4EAYwMEQTmDUfqEBXiCAC+DBhqBGYqBA0uCAHqAFVsBH4IOl5MAHAGLgRxvlQAdgCEOhkzogyMXkwAoggoV7AAcgB77gkjPggGQAQmAAeMBQYBGy4MDzIIBroE2lwICSIQBjpEARgEggBKFlgBigQfVjgF+ggLUgwKigALmgATxASSBCv6BAyaADEWBHtiAC/OABRKBCq+BBPaBAvqECgeCAF2CALKABLGCAH2ABpwCR0GBBGYDCBtyggC4AQOAAAiCXdOAAAgBEIEITQIbcoIAhIAAX4IG1IUATYMcQIAKH4QASYMAqp4AJoIi0YMAKQMvAQagAE8CLQCBE4mcACa9AX2CALeCRYWcAI6CVlmBTU6BCvShAQyZACaIAQyAAcABC4ABs4IYxIAEG4ADQ4EGn4EAN4IDUoIdZYcKQwEgglsygwOBggRbAcWAJpkGBQIJCQkDghSLAduAMFmBUaUB54EMLIJaAoICLoIoTocAxoAHbwIvAYAG6YAG54EOLYEAbYEEaIFD+YImgIJPvAFPgwPrgAoXghm4gADSgjGCASCAAL+BFpGGHtCAEbuCBzaCACMCLEWBBHgBT4QZlIcA0IAARIAGpgFrhQDTggBJhBIwhgLcgRWlgQwTAQaBBPaDDvKDAuuDQLmQAIkBBoUAhAEUglKdigCHgAClAU2RAIeBAL2GAVqBAVKCE+KGCbyAAD0BHIMGEQEUgiBzgQAThAEjgU1PgADvgkaLhADqAQePAGOAGPeAABiFAGOGBTeCAfuAAEqEChWBIPmBC4SDAQqEAiGAEzyDDAaBBb6EAjOGALeBAjCBDuOEBQ6BAIGDBg+BYPKAGBqBB2OKAIaAABaPAOkB24IA6YYARIIre+MA7IArFq4A7LEA6gHniQHLgQNXgQDIhADUgBdjgh1RhQCpgRPDg0tnATCXAImGAB6aA8uJBwaBAIeNBbiBKUeCAs2CNmaCAAqCD66CAAqADAaEAAqDAI6CK3aAADgBdIFF84FJqIED8oAIP4E0NYQIV4IKc4EE/YMHFQMBEDWCMCeFCOCABQQBAoUfnwMCQZSBESaDRHaFAFcDAhA5iABihBUJArQtgwxCgQmrgAAdAVyBYO0BToFkWYELnQIDaoE8xIEADAFsgAOmBEEBEC6DACYBbIId8IAGfQMQNkGABXSCAAuAA6MBG4MA1oAAVgFggwBAgQArhgHzgAANAqAtgUiugAFNAqAtgUhTBCgCmC2JB3SwAB+DAbCBEg+BFD6ADCuAIAmAACSBHxWCADSADPGAEk0BdIQAt4EPK4I/IIIAToEABgKkLZsA+4EQsYAB448A+IUA9IJhNYIBIwKgLYIObJ4BRpkAToACNYMBRIEBv4IjWIMhfYIAy4BF/QKDAoIVWYYBYwFsgyVogQHaAgFFhwAlAklxgA+VgDioiwAqgSFHgQ4ygQCVgBbHggInhgICgi3iwAICgQLsgwEMhCrJuAEMAQeEEWKAAK6AD7OCET+CAO+BWueAMvQBAYFJ0oANxoEV44IPA4Id/IYACoBi0YEzCgGCgRtkgAkGgBFoiQACgAT8gBvygBE6gR4vAQiDWXWAAAyAADWAGfSBAAqBTyuDAAqAAx6BMjqAAAqAC82BY6WAAAqAIKKAXYaBAAoCB0eBPR2BGMCBHoSAE+mBFdOBE7YFA0H6AUmBHreCEVuCP8iAFd6BBAOAIsiBAAqBLMWBHMwBCYJN1IEcrAEJgk26gRyigh3DgC/CgQAKgRDHgSJ8gQENgAnLgBRfgADUgl4Hgjl7gQcFggHjgAMggQMJAQOANLCAL3eCAHCCAyyCAyqBZB2HC3aBACuFAB+CBNeOA2qOAB+BAFqACAOCBaiBG20ELQCQIYADdYASjQJBhIEffYoDe4Au74IuRoMCfoER6wKIE4IAHAGIgCTjggKogicSgQOYgwyqgwOYggKUgQB/gRYUgQHmgQQ8gQNUgwnJhgDMAQOMAK2GAB+CAE2OAMyOAB8CIAWBAB+CAYmoBDaEAJyFBDeEACy0BDeAHeiBAO2BTj8GQQxsQZgggGi3AQCAM/UBC4AATwF+gBmMgzFyAZqACWiBV9gCQX2ANpSBNKSCADwBBoExVoYJ5IAA3oAExIUGCYALCYAKHgUAAQEBAoJU3IABewK4LYMDoQG8gAEKBXRyIgY7gAASghDCAwNBDoEy1JQLLQEGlwyqgREjArktgwyugFXkhQBdAmt2hABdBANBDWuCEbuAAt+AANEBNoAAHoQAcQEKvwBxgCgygQDAgQBzAkEJhABnAgdqgBRDgQBlAhAtggUQhAeaASuBT62CAaqAMZuBD8SCZkSAAA2AFxmFKHuBIluBDQqCTg6BAfyFNAKABRiCAAiAAbuDKOeGED6CACKCB7yDEJiBJK6CBVcBGIECDARMDQMagwhCgQHcgWdXlQDVggOQhAAqlQAjhQhsgA+ymAAmggAjAy0AM50AI4AAC7sAI4cAjwEKnwCPg1EKlgAjghUlgh/cgGp4AXaLEJCDAyoBGIFniAFKgwbIgGaVhlyIAkULgjTzAfqBJyQEQXsLHIBP7og1CwEQgAxhhzavArsBgDaMgRJwixL3gQ63glZcmBL+gAAgAUScACABQJwAILATXgF9ghJoAfGAE/0BC4FQ1AEBgADEAQmCE0sCbBCBcHOAACcBbYET6gcQQAu6CQEVgTXcAUCAJWSCBtICBkGBOZODDdYCIAeBEoICCkGADTSCZvYCdGqCBOWABPCAScuHBPCAABqAFvmCDXuCV76AF9cCIQmAbgwBDoEj+oFA3YIAQoAQTYIAQIEKeoAADIEkY4EAMoEkJ4AABIFOSoAW2YEZpYAlu4EsBgEQgB8JgiomgAA8gi8UgAA8gjtVgi8UgSNEgCG/gQAdgUo2hAOKgySKhABYgRuOBAhLGyGAOd6ADFEBAYImL4A8H4EA04EAzIE67YIAuYIAQYIeXwIgaoEAZQFrgAkAAgBOhGhRgAALgAIXgQCxAkdygBkegjGogCLQATuAI7KDAFKAAO2AAK6HAS6HASkBIoEJPgEKgwCfhAExgABagwEzgWEhgixSgAANgS5jhQFBAkETgUDJgE+KARWEBYwDAA4CgAuPgT3IDCESQe4IIRVBrgghFIE6bQF/gAARAvANgAARA7ANIYAyQQEBgBatBA9BCUuBaXuAZVyBYOABAoAU7QFxgGnDgARZAw90IoAHPQNrIReDEfCAKZOCDWSABIOBCiOBY84DdCEYgAosAX+BEcECIBaFAMKARQOAFDEBGoAyhgISTIRCNAHggjznARSBRSOACimBACaAQWMDBiAVgQdoAwshGoEk7oAIXwIiDoEBYIApw4BGaoMkzAIgGIIOLYEeZIA9EwEHgyyKAiAQgAFJgCUCAQ6BJMsDGSAagQP1gSZCgl+oAwFrdIMBYoE+EgF2glxhAQeAWWCJAhOGAoiAAbSEAoqAbMWAIcyBUswBB4FxF4AAy4FRjQEGgh9cgijBgEx5gwGwghzNAQyDChSCRUkDAiAXgCBFgRpQgwElgQAYBSAPIgkhgDdshwDLgQRQgQC2gBlMgQC2gRVPgRPWgD8kiACygWIHglmngD4JgmzwgwCYAQCCbV6AAJiCAqODX+8CIBOBAFaDWyCAJKGBAmMBDoEJ4oApA4YBiYQAB4Ifk4AApYEg3gFGgADKAQ+AbNeBPZqDGRkBS4Il/wQgDBsigEflAQeAALIBGIIBegERgQFNgQGTBAZ0IRCCL2eBA3EBDIAvvIEhoYA9cYEBToJKM4IC/IAFUAFKgW2bgDzfggJUgQJNggIgAyATaoACRAPTBkuEAlsFE0HRBEuAAl+CFEqAAtqAJUCCRa0CIA+BAReAAtWDCSCAM7WAUtkBdoEBMoAhOoED0oEAbIECNIMDrIEDyQEAgwMPgT5vg04QgwMdhwOTgAAYAQ2BAAiBAzyFJ0EDDgsrgAFfggHLgATbhB/hgQSTgVzwgQAHgmW8gGr4gW8AgwT1A2BB1IIE9QLEA4JxZYQ8goFV5QHVgRgkgRcbAdWABnSCAAeDUS8BAYEdcoMAHoMlpYAQVIEmy4ADNIEOkoFRBYAcz4EoKoEMDYM364AOYYAIxQdBoIbi7X5zgiASAgFxgXHngzBohBwSgAoagAoQAcCAb+6BABaCIaqBAGiBHKKDbyABc4Agu4FrpIAuKAF/gwKuggDlAyADc4InW4FyYYAAPoEQSIAAKokA8YUCXYAAQ4AYjJQAM4ACoQIIdoEAHoACwYkAHocAGYAC4ZMAGYAcDZMAGYAQuJMAGYAHMpMAGYADIZMAGYA71YoAGYIA4oAdUIEA4oAbRIIA4gMLvQWCB5aCA9qAACGAPKCEXiGBCviAADGAAPuBA60E8f8Da4ER+wRB8P8DgCDEgWqOgXKlgXaGA4CAPIAKF4AAW4IAGwMgAHKBWbqCdRKBHpiEAXaDAVSGAFGBZsKBdD2CAXGDBvSBAGMBcIAAUoEHc4EAbYFjLIIAUoAAUIACKQLbAoEMgANBsCuBD3iAbEmCDjeBAmeDAE2DAA2BMtuEAAuBDZmEAAuAb0qFAAuAALaFAAuADiGFAAuBFMCEAAuADtCFAAuBDUyEAAuBae6EAAuADqqFAAuAQOOFAAuABAmFAAuABZiFAAsBDocACwEPgQALgnWugC0IgiAsgCGJgQR3gwD4ggLZggAJgQGkArArgwGlArArhQKIAQKAAr+BAVIBEIcCyKQBUoYAWoEj/4QBzoJsS4ICuIAADYQAC4FmI4QAC4FxyYQAC4ABMIUAC4FooYQAC4FmXIQAC4FsqYQAC4ABMIUAC4ABMIUAC4E/YYQAC4ABMIUAC4ABMIUAC4ABMIUAC4ABMIUAC4UBMIACZIMBDAEQhAELgRezgS9aAnRygAFEAwsLkYkJeoARooMInocJfAEGiAl8ggUQhQl8gCjFhwl8iAjyhwl8ggBCgTpeigl5gUV3hwl4hGZsgXA+giR1BEHAAjaBDMySABeCTJKBFZGPCa2CB0+BJFCjCa2CCR2DCa2ICjeHCa2ALDyCAFyAbpiECo2CdCiABh2BCYyFLmiAEDOICa+ACMoBToEINYBbzAEggENVgWGnhAmyAg0CgFXfgSjkhgmzgQiEgD5BjAFnhwFihURoiAFqgQh/hAm1ggAXASCBCGuFAI6CBbkBFIAGzwUFIhMhFIwJtQKBAoAJMQmgDyEUQeAOIROBCbWBCUICoBCBABEBD4BaUYAHWAENkgmzAgQagQAbAnQigEraAWuAMiCECbQBDYIXHIEJtIBUJYAAIYAH0QEWhAm0gACAAiAVhQDDgCvAAWqALtMBGoAf6IADdoEGqgEOhAm3AROBABOAE4OFCboBDoABdgEUiQm6BA9rIheBAWuBCO8BD4MJugEHgCKBggs7gijzgAbZgQfmAxggDoEH0gMYIBeBB+0BGIMJugEGiQm6ggFpgQfJgilNAiAGjQm6hQLGgAG/hALIggkiAQaBCSIBBoEJuoAAz4FB9IM5f4UJuoF2v4gA64oJGAEZgClKgEaAgAAoAQ2NCRgBD4AITAQPGyIPgRq3ARGACVaHCRiAAPGACvuADKqCCRiAKcCAUESDMYCCAKyBVimDAmWAUdSBCRgBB4AkUoJldYIJFoAj9AISaoABpgHUhgkWAxJB0IIJFgEHgFQCgkX7g07lgE6/AQ2EMO6DMP8BEYAYfYQJFwELgAp+gAM8gQBrgAGRhAMWggkXgAM1ggyqgSzbgQAYgQKKgAKAhwL8giXJhwkYgQVugTXXgjBOhwqoggGkhAqohgp2ARKECnaCNjGCCncDCwuqgBHygQdSgRY6gTIzAwFBnoISRQQAQYgTgAASgAJJgmzJAkEegwAVAfyBYfaGABUBE4J8a4AACYAAWIMD4YgF0oABMAM7AZSAbC2BDqACsC2DRRIBqIAACIEAEAKgLYEToJIAOZYAGQMLrwKCAKyBD++BEi6BDwKAEkABBIASnYA8xYAAEoF04gEEgxKdgg8ugRnIgxBAgkQpgBBAghPBlAAcgAb4gxIsgmLNhABdgBKdihKbgTJGgxI0AgAQgEX5gwBKhxCmgwBKgjValQAchRELlQAfgAL7AXODFTCUAKiGHhODECKEJI+BD+oBEIA3E4MANYBtRIFAYwGngBPQgkdRggDMAwFBCYgBG4EBWIRtkIUA/wG4hAD/lQAgggEfgxK9gBKvmQAqggBKgiIggwGZgQCAgm76gAH7gQE8ghRwgTkkgQA6BMAtC6aFAKmBAeCEAK2CSie8AK2FAIKCTUqBClABSIJtXp4AVIEAP4cAuoAKgIIB9AQLC/wKgGgFgwarhQX4gRtcgxJugQwyASKAKw8BLIETvoEKnYEDVAcJQf+A/59/gjSsAQaDP3qBDB2BB0CBGVmDBzaCIyOABTaBGWyGBmKABxWCAuoBAYFwOgMvAbyEAAgByIAACAJBIINYfIAMh4E9KIAcroAMW4EAOoAhtIIRcIUWKIEYFIQpGoAOX4ANaoIpAIEBFwWYFmoQL4IACgGkhgAKgACwgQDFBJwWEDCCABCABAKBABABqIUAEAGwgwAqAkH+gYAdAkESgQYjgAECgDVggQZyAQKDL7OCN50B8IBBxIMA2oMF5oYyD4EATgEtgQAygBe6AwVBEYABgIEEEQYoAqwtQQqAIsmAWQ6ACm2AJteAAAqCLFCAABuAHKCBeOCCEYaADXyBHpKBGrSBTt6Aeq2DHmiCJjECECuBAICCBByDdcGAAnOAGA2EACGAFVOABCeANWsCciKARriSBC2NAhGJA8eXAmGBOC2FArSEBC0BAY8ELQJBoIBBjAMaEDGCAoeBJhCEAI2CdwKGAIeEAJq5AI+EAz0BDYEqpIEAmoAAlIIKi4Q3AIRMRoEAk4EB6YEt9gH+gls+ggHogUlaggEXAQyEAJCBIYuHATK4AJgBBYIH04kBKoJuggELggEohABngWwKgAKxgH88gwChgACKAQGHAIqAYzDCAIqDCF2WAIqCAGeCABKHAIoEBkH9/4MBJYIAkwENhwEdwwCTkQEfASKAPaKCAksBDIIAmYcAb4UAGAEEgACfgwHKggQ0AQqGA5iAA+uCE3UBCoJCtoEcbooDk4F/a4YAR58DBYEnV6AAwYEZz48AvIgDB4kArIYEDoEEcoAAkAMJEDKFBHCAZ84BB4IADoEgqQExgReWgH0YgiGJBywLC5YLARKBDT8EIGsiD4AqpIJ1Z4BhrYIXj4INCYEX5oElogEAgk1NAtDHgAhxAdCCRymBAAQBSoKDbwNB2CiDDtoC3BaBVeMBf4MVFIIMF4Fqa4ESWoBXbwEogW3ZgBT/ggDagQCkgFd8ASiAAUuFOeCBLzyBFG+AJjmBVP+CcE6BQtiAH0mAgh2ACPiBAMGAfvuDEqGDBPeCHB2ABO+BNG8CCRuBFoSCbjKDBP+CE5+ANG2AACMBrIEajAELgXQrgwBSgB4bgAG3hQGiAdCALZSAChWEAJCCFVSEcM2GAHCAa6GCLFeCCgyBBgWBCduCAXOAAV2DJiCABmyCAPSAB8iDBrkC0CiCABGCAO+AAISAAF2AABUB4IAMBoICQoIAh4JF4gLgFoAAEYAfRAIQM4MAjwHUgACPgjGlAdSFADKCHwiCAJeABm2EAP2JACaFAB6EATSCIYKGAOoBBYMK4YMMcYEA94INhYN4QoAMKIEfuYEWFAEEggAKgBokgR7JgADfhCHNgQr7gC1NgwsCgBw/iACthEPxhgHcgCshhAaQgwCcgACOggCcgwHhggDKgw8MAbyAAieARc2BGfqAcEqBAmYBCYYCcgEQg3wZAQiDW1ABBINOpoJD74I0hIAKRoI8T4IsCIUcOIYUEYIx1YEMrYMAhIMBYYUK94AxP4IJ7wHUgACtgACUBrwETBshEoIHboIBzoEjGIAv1IAx+IEvNoQAPIEktYAX84A0QoAB6IBSZYQ8YoFDwYEANYEHJQVMIgIbIoIXgIGD9oEqEYEFdAIgDIIV/oIX34se14IU8YA+jYEEIIBIMIFWRIMAbINsZIMHzoAAaYAAfIABpQMQamyDB9GANB+HAtmAQN2AFkeAAIaAAcOBACCDAt+AAMqChuKBRyiAAHaCRNkBAYICg4AB4IEK84KAvYE8noIO3oEI0YAASIE6poIOOoNIvIEBHIEArAECggImgl+igQ5egg+4A0ECSoEABYAtGoAAO4EAXYEAlIQAboEOP4IC/4ID8IM4LIEtKYQBR4EBEIE+HYIJWIAfxIEBQoAFfIMFT4MA9IAAFIEIVQIFa4QA8oAR+4UDbIUTBYEK4oAMuIIWuAMAQbqAAkeBAU+BEJCEAhyBGvEBf4I6nwIASIECxYIEioINWIQbhIMNBoMAgIEFBAEPgwJJgS/RggXIhgGkgoIfgQB8AXGABdiBDj2CAmgBS4QD6IQ4NIITv4JD+IIAnIUNpgEPgA5XASSAFa+DAF2AhreBHHGAbuWBA3yBABGABt6JAraBhVKAA62AA1KHAOsFC7YCAQmABxmBOSyCgmyCAsaABtECOwGAP0sBQYACQoAE7gRBB0GKgGbHARuALHGDDkaBHC4BCoE6ZoEEhoMBAYJ1voEK2ICGroADHoNCyIIaBYAZooF5K4IW7oGMzIQC2IAv24EET4EFjgFLgRBtgAbOgAVegSe5gAQHggE9gxotgALtggDHgh/2ghYqggcdhQAlgHDohgLzggLYgAtugRCLATuAAAeDQvqBCuYBCYJ1KoEAHQHAgwAdAsAVgweagAASAcSDABIBxIBivoARWAIKQYA7hIEEtgRGIgMbhQD3gCTwgAMlARuEAQ+CATgC0AiAATiDDESAJPqBAF6CCr2CCY2ACr2BAHqDBpCAIryAEYeBQNGCekOCB7YBL4EFDIEANYFDOIIikIMBgIIAkIEOsoIcfIQHlYEhwYIPJIAHp4AzgwIDSIcH8Y0OgokPI40AHIgH8YATp4UAXIAH8YMPgIEFqIAU+4EMeoEAC4MK7IAk7AKQIYFBcgJ0IoEWpAQvAYYIiwCmAoQIgDawgwBLAQeAAKeAAjaDCJmDAKsBB4gAq4EHeIEAj4JUAIUtQ58Aq4BY14UAYIAAq4MAYIEkJoEAq4QmF4UInwYJQRxrQWyBF7WCf1YCkB6BOnCDAIyAAA8BoIA0hYA0mYMAkoAaCoIJSYBJAocJ/40AhoIuOoQAHJYQcIwJ/QEEgAqSgzSVhAChhABqhAAVhQCrgACCgQB6gQq0gQ1jgCbRgUgggA4SgR8eBIECSRuAAXgBI4MBeIAW94AC4YANoYMAt4ECGYBEpokRN4AAfQEGhgDakgCupBE6hwFsgADHhABggQe6hgFsAQaGI9oDCUEEgVsjgAjFgAFpAR+ADLCAADuAAAsDoBwigACLhAKigTSwgQK8hAIVgwB/hytZqgIHgYAYiwFnjwCghwByhQLShgCwgRzFgBhsgiF/AqAtgUNygALeAy8BgoGGLYJ82AMvAYCBcryBAD2EAhSDXbubA2+iAiKBETCFALiAgMuEAQ2AiIqDALaBeM2DEKEFswsBCn+DBWuBBY8BIoAfEIEw7YAs9wEbghsvhAV5iwV1gI/CghzcgA6LgQcVgALygU2VgTgkg00Xgj+EgmoygIMmgStDggWEgwVxgQs4gj3SgBVJghVjgABmggTFggDEgATFgR1CggSagQJ9gAFbgQJ9gD2OjAElgAHyAQWIASWNAeKJASWNAByIASWAXOCEASUBBYAB3YMAYIGCjYQBJ4EACwELgQqGgSXyhR4ngRXehxA4hBRUgXrdgRA6gQX4gAD0gRTlgh2whQDmASKCSSaDix6DIeSCA0+CAqaAHluCAfWZA02iArKCI/mBBWCBAMCCEhuBbjSABByDAfOBG0GGD86CfFeBBraDAIqBKraBAQwELwG+FYB2H4YEs4kDRsAAlIEEeo0AlIAF/IAAJ4IBZAEFhQ83gB1chFsFgSoXjQ8zgQ4TgQBtggasjA8zgQJrgi9njwHtjAU2gHcFgyfhgVCZgA/HgQaFhgBxhAAagCs/gQAagkrKgDwQhHuAgQfQjQE3AcL6ATcB/oUBN4QPmeIBN4APrJABM4NOxIIBJgHEjgEmAcb6ASYB9oUBJoIqHeQBJoMqOo0BJoAIQYN+WYIj/4IDkYIKA4At4gFGgA1zgQWPAQiBBYqBCgOAAA+ALiGBBY8BCIQKBwL/AYCX+4MQmoEJsYEQmoGRooUMkIBNOoAMC4FKnYMNKIMOBYCNHYEAnYAOzgEEgAyugkONAQSAHRKCGyuAAWKABV+FAECCBLKBBKWBelmEMPOBABiALt6DABgBDYM9nQENgSpzgATvgQ9cghCPgAAIgj4agAuPgw1cgBraigBCggBjggBagXhbgQDtgQy3gQA/hA+tgXl3gQEpgg9Vg39uhA0ehQAVgCmLAwALg4EahIANGYKMDoQ7zoF2X4EACIVf84ApfoEACoEPggEggS+3gRYHgz0KAduAG6oEAUEWTYAru4AGs4BfxgSggAJxgCe4gQBNgzb1AQGAm8aCC9oDQSpGgUA4AgVGgV/lAwBBOYEtAYEG+YACXwML3AmCAYaBkPqAQs6CAhQBLIEr9oAG34Byv4EAD4AAA4BUXoIruoMpOYMXo4J74YJ64YMCLgJBKoAWwAJ1IoB5b4EBtYACSIEAFwFsgwg5AVyAJaiAAYiBi42BmLaABI6BAGuAAtyBYhyDFJsBT4ASTwFLgRbjgBwAAUWAZfIFIARHcnKBZFuCLJyEPNCADFuAanOALKmBArqCAs6AW2qAHU2EFgOFABOAIpmGGnCHABaBk/WAJCqEGmWHABiAHY6GNKSDLnaAHKKEgHOBARiBAAgBOIIAxoFD5IEAt4AfvoI33oIBBIBEMoEAJYE3q4KLFIE3fYEvroALx4EADYAD8YIDboIAXQFcggANgVH9gDfGgQF/hRk/ghyqgDWFAhA3gi0NhwARggBWggANgQdeg4kngTlhhBrqgn4/ggFjgBCcghjugQMTgn/Tg35DgQGEggJ8gRB6gYGUggSbAiwigjMagnvKgRyjgi+MgQJjgQEkgQDZhAAlgi3XggPbAWyDAEOAABeAY6iBAdiAAWQBBIKY/IAAkYEuKIE0KIEASIEDw4FFAIQBIAGwgARGAUGDg9SCCUGBAHCCALCAAEKBAAcCtC2BQI2CErcBtIMAGYEwFoQBe4ADUYNBOIIAkAFsgSTPgQCLgglSgQChgwBBgWkGgQq/AgVJgDrTgABhggBIgQC0AVyBBT+AACMCxC2BHueCABMCxC2CDtUBBIM0JwEBgAMkgZ9RhAFCgTZXgSIAgQL+gQGtgBpkhgD0gi8LhAAlggCygQLVggmMgEILgCo5gQBfgpJ7gwCggTnLgQHphAESgomvggFZmAESgEgVhBOsAWyDA1SFARyCAYeCBo6CAnCCP+yBBYqBMs2BG1iDATaADQEBA4ICP4MBLIGUmoMAjIIAOIUBLIAAo4QAPIABToMAWJABJIQBAYAMkoAKeIQDy4IDCIUD54EBDoAy2IIDt4QCUoFG+IAD0IMhhoAQtAFFhQO0AQaAYV6ElV6CAWODgx6DAKgBOIAFMYIMfINHdoGAO4ID7IAE6gEagzHAgwGWARqCOzWAGJmBA/yDA0qBAwGCAWGBA7KBEucBQYBa0AEDgorSAUGAQkuAHV6AJIUBi4Muz4JjnwEQgAqkgy9fghfJgGs+gRqTgZSshAVsgjkFgBo7hQJxgBT5ggN/gi+VgAAYgAANgUSGgQQ2ggANhAPVgRptg4FPggBdgWVqgwAcgjVdggAWgACQBBALC4SBHe6BADKAZCeCBEiBJ6WCBAOCA0SCXCyCANGBAiuHHWiAOaYBGIEyp4M4rIIAcwEwgh73gUB/hBGLhQAThDpohABGgACkhAf2gAS4gAANgSI8BQuECQEPgQd3gSDogRk+gR2ugiSDhwByA3RBhYJaSAEAgTcpggARgAKzAoYCgjy1gzCEgzmvgTU8hABuAVSDAriDAoyABwSCAe8BSIEABQNYdHOAgKOBS3qAAA2EAq4BNIAfAoMWcIBQpYMU04EHUIAJTIIDR4IStYQBlQEsgAB5gUUWAgNrgQdtggQrAhA6gjXFggD7gjU7ggT1g1N4ggA0gDTFgwNagTR/gQARgTTFggMWgAAFAXCABQSGCQ6SACqBjzybACKCNd2CBnaBhJqGNd2AEVyBNd2EFZ+DJUqBb16BUiSBXVmBDn+EEKyBRMCAF8QCkCOBCDCCDVyKADaCAHsBdIIA34EE34ABP4IADQKkLYEUSIEAlYFFVoABgIMD3QKAAYUeEoIV04AN6wFgggGIgRz7ggEkAUiDB7EBbIMEXwE0gBfTgQGMgCyFgQGCg0X7AVSATfeBAa6BLTmBAEmCAPaEBdeBFIqECR8DEHRzgE6AgXH3AUiCbhYBDIMByoAlXoIBx4EWIYJfWYELGIMKUoUAkYIpSYI1A4QAV4AksIA4K4ILfoM2+ocEuoQAd4IEIYAAD4FUqYQCQ4MCbIFU7oMBjoECXoEAGYIATYILMoIANYEASYQ7S5YBxogaprAAH4ML3IFSwJQBvYQ3FYMA1YcBTII3FIIBy4Kb1IFEoIQGToALSoE3GYIAwAECgzcZgQQXgjcZgwBGiATxgQAHgztQgpoMgaJtgwY4gAFgAU+AR+2HOqeEAF6CaZKEAF4BAYQ6V4GXJIE6pI0AXoI6pIQAYgEbg0YtAqAtgzpRnQBPmQCtgUaZgAdfgSH2Awu+BYARsoID4IALqYAD4oMKa4Kg0IEACYI03oIEUQFqgRSLggAdASyAA5qCBJaBB1SBEaaBlb6AGIyFBa8BcIAKVoFeh4QCR4AKY4I8vYQGL4EAHAFcgwR+ArQtgj7kgQuahAh0AUSBAAUBTIEd6YMRy4FEIoEAioABCIIG6oMQ7IAADIJD/gQgCE8bhCWjgAuDhAmAgwyeghqkghjOpQA7gBe5gA3PhAhogIXWgkb8gQJEgwV5gwFiAgRqgAcmAhA3ggASggfYAXSDADCBB9GBExCABYmEAneBCG6CAP+BQoGAHleCHDuHAzqBDQ2BAzyCBA8BWIAxKIAFnIAf7YBRFoEQJoEStYAAfoKUb4NAfoEqL4AD8gEIhAAmggDogAAFgEpLiAXCggE3ASKAUjSCA/uAHNyDAwWCGs6CAWSFHIeCHayCWIOBGjMBhYEACoQCHIE/0IUJbIMJaQHEgB9TgiMLgyUbggEJgCM+gAJlgWAGAYKCOwqBpCIBAYAADIAIhYEjHICKGIVKgIEDQoEISoI4p4Gc0YIPTII8CoAAQoGlpIECroGKCIEAB4QM74AHjIAUI4UAQQEBgp+Wg4b2gQCPgA0CgABDgRRxgAkhAwurBIAflIEAGQF8gRlHgCjfgQAMAXiDAX0CjAGFDTuECuUCLGuAAuOBGcCBBUoBA4Bh7YIFgAGQgJACggDbgAGVgAxUgAA0ggWQATiAHMmBoHWBURaABZQBB4I9k4Eq9YEu9oEE04NYIoEACoIAmgE0gB2AgQGYgx0pgQrWgF3AgQv/gwAvgBnzgk6gggAyAiALggiTgQAKgVo7hAANgANKgz4KgT34gxIwiGYwhj3/gACAggAtgQV9gT3QgAANgAHRgj4FgAv0gTEugAANgDpAgAKSgTEigAANgAnHgABQgTEWgAANgD4OgASegTEKgAANgD4RgAGDgTD+gAANghRqgQVKgQc8gBAMgg9KgC6rgT4XgAeMgSC4gz4egACfhD4egRB8g4WQgF9PgQAKgkAHgB3cAQaDRdOAETUBBoOhO4JbW4Ico4AA14IU84IeS4Ja5oBt5oMCFIAC7oMn2YAC5oBKAQEggiLrAQODTo2BAPmDAXeALCiCAAqAABSBTpcBDIBNGIBf84IDCYED5gEBgQuugS53AiIJgQLOgRlLgQAEBUkbC6ALgRwpgwlzgSoZhAlzhQl1ggIFiQlzAUWDAheBCXSAQJyAAV2AQuKCBX2RCXOCAmKaCXODB/WTCXOCCWyAApWFHAOCCHEDNgJ4hAVTgGUYgAIVgSJAgABPAWCBToiFAFABgIIA74EC3YIJoYQEdIUJpAEEgAmkgwf2gEy2hibRgh5MgAulgAH9AUGAAUODADWBAGeAVAMBIIEA2YgAbIIC3AF4gqObgwjoAQWFYMiAABiJB5GCBjeBA0KAAAmFCeiDCogBZIAP7oACT5sHx4BQvccJ7YEo3LQJ7QF4gR3fggkrhAF8gD9QgAeegACMgCjkgRsVglojgQDdgwahAaSCAPoCoC2OCa6AHeWEHbKEAiOBBQyCNMyJAh6ABZiVBc+DIGSLCcqCGiOECcsBeIQJy4MCE4IJvAFohQnZgQ5zgZHUhgl5AVyBUIeGCCoBBIUIKoCjT5oI14Kk+IAACgFohQWOggX+hAT38gnUhwm4iAlVkAmzggLUlAm2hANigQoOhgiahgoohgD6AQSCobKDAVWUAC6ABJiCqZ//ASGHASGCAgjoCouGAmG4CouBBF6AjxYDAAs/gg+agQAejxcghj/GlAAfgAAcglI2AgRAgAGUAQOAAA0CgweBN1qFP2KAENOAIiWBLjyATW2Al8aCULCOdeuFDu+BFfgBQYAjsIAAMAF/gFCoAQaCpL0CAEiAP46BE52BFj+CMuiAVRiCesqCBTGBNXiBF4mCBtyAF3qCkRUCCEmBIbwCS3KAFfOAUuKCBRCBdj8ByIAJjYFUz4MAcINePYNXjIEFY4KaDQJBKoEQioABX4IWuQRC//+BgmzZAVSAAAwDgICCgFF3ATeAW8SATlOBAWaACXmCVmiCFoOBAAyBWtqBCt2DVJiBAHWBI8+CAOSAAHeBVUSEABaBT4aJABmCAseCABcBTIcAF4JCFIAAHQHEgR6TgABegFkbgDjKgAAJAZyEMQgBKIEAD4AYXoQAMIEEgIFkuIAARgGcgSwPAQKAXrGAe+eDFRQBOIJXqYAE84QACAFEgks1gpMgg0Q6gAGRAYCCZ2yAQRSAeNaCB/2BAH4BiIEjhIALRQGEgQCOgCoZgGkkggpUATaCRV2BQzUBbIAFngE2gAQbg5DfAhA0ggHdgACMgBN2incXgACngY9Wg19ShRIZg0G7gAUngRpRgQokgWVJg0G9BEE5QSqBJY+AAdSCp0+CK4mBAv6DS0qCNWeDUoqACpeAS++BAGaAE6ODCCuEQ/oGQYgRNgK4gI+lgAALgB8IgBRvgo+xgHpvAayDABWACJaAALyBABUB4IAAFQGggwAVgAijgADfgQAVAX6CeBOAKpCDAL2BAK4BLIAGIoRbhIVEKIIoEgFEgDgahDK+ghZehQuBhkQhgiqgAiA3gQbcgQCrgG1ihQAShEQ3AUiDAReAMFsCDGyAGOQClCCBCVoBNoALK4EDbwJBkIQADwGMgwAPAZKEAA8BgIMADwGWhAAPAXyBDmACC0ODGVyBWjCXGVyCDWuBOE2CGVyBAAqAATmAeSgBSYIEGgMLC+OAjWKAAhQEC6EEaYCzYAVmZmljaYCy5QEgg7TZEwAxLjMuMS4xLW1vdGxleQBpbnaAs20VZCBsaXRlcmFsL2xlbmd0aHMgc2V0hgAcBWNvZGUgiQAZD3Vua25vd24gaGVhZGVyIICz0wFniwAyAmRpgLN3AW6AtAmKABYDYml0hABHECByZXBlYXQAdG9vIG1hbnmFABcHc3ltYm9sc44AGAJvcoYAU4YAJIUAVoKz9IAAXYC0QAFrhQCmAgBigAD4gACaDGVycm9yAHN0cmVhbYQADYoA1QstLSBtaXNzaW5nIIC0pwQtb2YtggBHgAAlAmNvgLQtAmN0hQDjA2NoZYoAF4QAmI0AFwRkYXRhhgAViwELASCBANQFZmFyIGKAtJABAIUAVwJyY4EAgQVtYXRjaIYAMgF3gLT0BG93IHOBtQOGATuCAN4DdHlwhwATiwGyggDQjwB1ggAWhQGvBGNvbXCAtSQBc4C06YACDgR0aG9kgDInEwwLpQIDAAQABQAGAAcACAAJAAqAKQcNDQAPABEAEwAXABsAH4CVbhYrADMAOwBDAFMAYwBzAIMAowDDAOMAgAY4ggABAYCMAAIBgYQAAgGChAACAYOEAAIBhIQAAgGFhAACBZAASQDIghjMgK1JggCEAQeAAIABDYAAegEZgCkpATGAA4wBYYAARgHBgEjqAYGBSOyAQBYEAQYBCIApDAMQARiABbwJMAFAAWABgAHAiQB4hQBwhQBoAYaAAAIBh4AAAgGIgAACAYmAAAIBioAAAgGLgAACAYyAAAIBjYAAAgGOgAACARCAAHIBEoAAiAEIggCAAQaAAQIBBYABBAMEAAyAAJaAHJwCAA6AAKIBD4CwMwQOC7cMtQEsgBzVggABARCMAAIBEYQAAgEShAACAROEAAIBFIQAAgEVhAACARDAASyJAICFAHSFAGyBAGQBFoAAAgEXgAACARiAAAIBGYAAAgEagAACARuAAAIBHIAAAgEdgAACAUCAAAIGoAgAAKANgACIgADQAR6AAAQBD4AAVAEggAAQAiAOgwDgAR6AAASBABSBAAEBoIQAFAETgAAEAQeEABQBDIABOAGMgAAEAUyAAAQBzIAABAEsgAAEAayAAAQBbIAABAHsgAAEARyAAAQBnIAABAFcgAAEAdyAAAQBPIAABAG8gAAEAXyAAAQB/IAABAECgAAEAYKAAAQBQoAABAHCgAAEASKAAAQBooAABAFigAAEAeKAAAQBEoAABAGSgAAEAVKAAAQB0oAABAEygAAEAbKAAAQBcoAABAHygAAEAQqAAAQBioAABAFKgAAEAcqAAAQBKoAABAGqgAAEAWqAAAQB6oAABAEagAAEAZqAAAQBWoAABAHagAAEgHm4AgC6gAAEAXqAAAQB+oAABAEGgAAEAYaAAAQBRoAABAHGgAAEASaAAAQBpoAABAFmgAAEAeaAAAQBFoAABAGWgAAEAVaAAAQB1oAABAE2gAAEAbaAAAQBdoAABAH2gAAEAQ6AAAQBjoAABAFOgAAEAc6AAAQBLoAABAGugAAEAW6AAAQB7oAABAEegAAEAZ6AAAQBXoAABAHegAAEAT6AAAQBvoAABAF+gAAEAf6AAAQBAYAABAGBgAAEAUGAAAQBwYAABAEhgAAEAaGAAAQBYYAABAHhgAAEARGAAAQBkYAABAFRgAAEAdGAAAQBMYAABAGxgAAEAXGAAAQB8YAABAEJgAAEAYmAAAQBSYAABAHJgAAEASmAAAQBqYAABAFpgAAEAemAAAQBGYAABAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.quickErase="no",this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.quickErase=config.quickErase||"no",this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),config.quickErase&&this.setQuickErase(config.quickErase),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),"yes"===this.quickErase)canvas.remove(obj);else if(this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setQuickErase(quickErase){this.quickErase=quickErase}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),this.trigger("chapter-pages"),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getPages(){return this.chapterDocList.map((_item,index)=>index+1)}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterSizeCache=null,this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; +import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();if(0===rect.width||0===rect.height)return!1;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.quickErase="no",this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.quickErase=config.quickErase||"no",this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),config.quickErase&&this.setQuickErase(config.quickErase),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),"yes"===this.quickErase)canvas.remove(obj);else if(this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setQuickErase(quickErase){this.quickErase=quickErase}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),this.trigger("chapter-pages"),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getPages(){return this.chapterDocList.map((_item,index)=>index+1)}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterSizeCache=null,this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; diff --git a/src/utils/common.ts b/src/utils/common.ts index 3798dd48..59165020 100644 --- a/src/utils/common.ts +++ b/src/utils/common.ts @@ -1586,10 +1586,15 @@ export const splitSentences = (text: string, maxLength?: number) => { if (sentence.length <= resolvedMaxLength) return [sentence]; // Try splitting by common punctuation marks (Chinese and Western) - const parts = sentence - .split(/(?<=[,,;;::、…])/) - .map((s) => s.trim()) - .filter((s) => s.length > 0); + // Avoid lookbehind (?<=) which is unsupported on low-version iOS Safari + const rawParts = sentence.split(/([,,;;::、…])/); + const parts = [] as string[]; + for (let i = 0; i < rawParts.length; i += 2) { + const merged = (rawParts[i] + (rawParts[i + 1] ?? "")).trim(); + if (merged.length > 0) { + parts.push(merged); + } + } if (parts.length > 1) { // Greedily merge parts to minimize the number of resulting chunks diff --git a/src/utils/reader/mouseEvent.ts b/src/utils/reader/mouseEvent.ts index 100b920b..61352ea1 100644 --- a/src/utils/reader/mouseEvent.ts +++ b/src/utils/reader/mouseEvent.ts @@ -72,7 +72,12 @@ export const getSelectionSentence = ( let fullText = (el as Element)?.textContent || ""; let selectedText = sel.toString().trim(); // Split on sentence-ending punctuation to find the sentence - let sentences = fullText.split(/(?<=[.!?。!?])\s*/); + // Avoid lookbehind (?<=) which is unsupported on low-version iOS Safari + const rawParts = fullText.split(/([.!?。!?])\s*/); + const sentences: string[] = []; + for (let i = 0; i < rawParts.length; i += 2) { + sentences.push(rawParts[i] + (rawParts[i + 1] ?? "")); + } for (let s of sentences) { if (s.includes(selectedText)) { return s.trim(); From 48f7246f2dd4439da24d77ea6ef3f8617a7e476b Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Sat, 3 Oct 2026 15:26:52 +0800 Subject: [PATCH 28/42] Add translation for "No path found for this book" in zh-CN locale --- src/assets/lib/kookit-extra-browser.min.js | 2 +- src/assets/lib/kookit.min.js | 2 +- src/assets/locales/zh-CN.json | 1 + 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/assets/lib/kookit-extra-browser.min.js b/src/assets/lib/kookit-extra-browser.min.js index f0239bd2..ede57818 100644 --- a/src/assets/lib/kookit-extra-browser.min.js +++ b/src/assets/lib/kookit-extra-browser.min.js @@ -1 +1 @@ -import e from"axios";import{Storage as a}from"megajs";import{Buffer as t}from"buffer";import{S3Client as o,ListObjectsV2Command as i,DeleteObjectCommand as n,PutObjectCommand as r,GetObjectCommand as l}from"@aws-sdk/client-s3";import s from"crypto-js";import{AuthType as d,createClient as c}from"webdav/dist/web/index.js";import{SSE as u}from"sse.js";function m(e,a,t,o){return new(t||(t=Promise))((function(i,n){function r(e){try{s(o.next(e))}catch(e){n(e)}}function l(e){try{s(o.throw(e))}catch(e){n(e)}}function s(e){var a;e.done?i(e.value):(a=e.value,a instanceof t?a:new t((function(e){e(a)}))).then(r,l)}s((o=o.apply(e,a||[])).next())}))}const p=e=>"json"===e?"application/json":["jpg","jpeg","png","gif","bmp"].includes(e)?"image/"+e:"zip"===e?"application/zip":"epub"===e?"application/epub+zip":"txt"===e?"text/plain":"pdf"===e?"application/pdf":"mobi"===e?"application/x-mobipocket-ebook":"azw3"===e||"azw"===e?"application/vnd.amazon.ebook":"cbz"===e?"application/x-cbz":"cbr"===e?"application/x-cbr":"cbt"===e?"application/x-cbt":"cb7"===e?"application/x-cb7":"fb2"===e?"application/x-fictionbook+xml":"html"===e?"text/html":"css"===e?"text/css":"js"===e?"application/javascript":"xml"===e?"application/xml":"xhtml"===e?"application/xhtml+xml":"opf"===e?"application/oebps-package+xml":"ncx"===e?"application/x-dtbncx+xml":"mp3"===e?"audio/mpeg":"wav"===e?"audio/wav":"ogg"===e?"audio/ogg":"mp4"===e?"video/mp4":"webm"===e?"video/webm":"avi"===e?"video/x-msvideo":"wmv"===e?"video/x-ms-wmv":"flv"===e?"video/x-flv":"m3u8"===e?"application/x-mpegURL":"ts"===e?"video/MP2T":"3gp"===e?"video/3gpp":"3g2"===e?"video/3gpp2":"db"===e?"application/x-sqlite3":void 0,h=["books","notes","bookmarks","plugins","words"],g=e=>{const a=atob(e),t=a.length,o=new Uint8Array(t);for(let e=0;e{let a="";const t=new Uint8Array(e),o=t.byteLength;for(let e=0;ee.toString(16).padStart(2,"0"))).join("")}))}function N(e){const a=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],t=(e,a)=>e>>>a|e<<32-a,o=(e,a,t)=>e&a^~e&t,i=(e,a,t)=>e&a^e&t^a&t,n=e=>t(e,2)^t(e,13)^t(e,22),r=e=>t(e,6)^t(e,11)^t(e,25),l=e=>t(e,7)^t(e,18)^e>>>3,s=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],d=8*e.length,c=(960-(8*e.length+1)%512)%512,u=e.length+Math.ceil((c+1)/8)+8,m=new Uint8Array(u);m.set(e),m[e.length]=128;new DataView(m.buffer,m.byteLength-8).setBigUint64(0,BigInt(d),!1);for(let e=0;e>>10)+c[e-7]+l(c[e-15])+c[e-16]>>>0);let[u,h,g,f,y,N,v,b]=s;for(let e=0;e<64;e++){const t=b+r(y)+o(y,N,v)+a[e]+c[e]>>>0,l=n(u)+i(u,h,g)>>>0;b=v,v=N,N=y,y=f+t>>>0,f=g,g=h,h=u,u=t+l>>>0}s[0]=s[0]+u>>>0,s[1]=s[1]+h>>>0,s[2]=s[2]+g>>>0,s[3]=s[3]+f>>>0,s[4]=s[4]+y>>>0,s[5]=s[5]+N>>>0,s[6]=s[6]+v>>>0,s[7]=s[7]+b>>>0}var p;const h=new ArrayBuffer(32),g=new DataView(h);return s.forEach(((e,a)=>{g.setUint32(4*a,e,!1)})),h}const v={_chars:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",encode(e){if("string"!=typeof e)throw new Error("Input must be a string");let a="",t=0;const o=this._stringToUtf8Bytes(e),i=o.length;for(;t>2,s=(3&e)<<4|n>>4,d=(15&n)<<2|r>>6,c=63&r;a+=this._chars.charAt(l),a+=this._chars.charAt(s),a+=t-2>=i?"=":this._chars.charAt(d),a+=t-1>=i?"=":this._chars.charAt(c)}return a},decode(e){if("string"!=typeof e)throw new Error("Input must be a string");for(e=e.replace(/[^A-Za-z0-9+/]/g,"");e.length%4!=0;)e+="=";const a=[];let t=0;const o=e.length;for(;t>4,s=(15&i)<<4|n>>2,d=(3&n)<<6|r;a.push(l),-1!==n&&a.push(s),-1!==r&&a.push(d)}return this._utf8BytesToString(a)},_stringToUtf8Bytes(e){const a=[];for(let t=0;t>6),a.push(128|63&o);else if(55296==(64512&o)&&t+1>18),a.push(128|e>>12&63),a.push(128|e>>6&63),a.push(128|63&e)}else a.push(239,191,189),t--}else a.push(224|o>>12),a.push(128|o>>6&63),a.push(128|63&o)}return a},_utf8BytesToString(e){let a="",t=0;for(;t65535){const t=e-65536;a+=String.fromCharCode(55296|t>>10),a+=String.fromCharCode(56320|1023&t)}else a+=String.fromCharCode(e)}else a+="�"}else a+="�"}return a},encodeURL(e){return this.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")},decodeURL(e){for(e=e.replace(/-/g,"+").replace(/_/g,"/");e.length%4;)e+="=";return this.decode(e)}},b=e=>{const a=(e,a)=>{const t=(65535&e)+(65535&a);return(e>>16)+(a>>16)+(t>>16)<<16|65535&t},t=(e,t,o,i,n,r)=>{return a((l=a(a(t,e),a(i,r)))<<(s=n)|l>>>32-s,o);var l,s},o=(e,a,o,i,n,r,l)=>t(a&o|~a&i,e,a,n,r,l),i=(e,a,o,i,n,r,l)=>t(a&i|o&~i,e,a,n,r,l),n=(e,a,o,i,n,r,l)=>t(a^o^i,e,a,n,r,l),r=(e,a,o,i,n,r,l)=>t(o^(a|~i),e,a,n,r,l),l=e.length,s=1+(l+8>>6),d=new Array(16*s).fill(0);for(let a=0;a>2]|=e[a]<>2]|=128<{let a="";for(let t=0;t<4;t++)a+=("0"+(e>>8*t&255).toString(16)).slice(-2);return a})).join("")};class k{constructor(e){this.queue=[],this.runningTasks=0,this.totalTasks=0,this.completedTasks=0,this.hasFailedTasks=!1,this.downloadedSize=0,this.maxConcurrency=e}addTask(e){return m(this,void 0,void 0,(function*(){return this.totalTasks++,new Promise(((a,t)=>{if(this.hasFailedTasks)return void a(void 0);const o=()=>m(this,void 0,void 0,(function*(){if(this.hasFailedTasks)return this.completedTasks++,void a(void 0);try{this.runningTasks++;const t=yield e();return this.completedTasks++,a(t),t}catch(e){throw this.completedTasks++,t(e),e}finally{this.runningTasks--,this.runNext()}}));this.runningTasks0;){const e=this.queue.shift();e&&e()}else if(this.queue.length>0&&this.runningTasks"application/json"===e?"json":e.startsWith("image/")?e.split("/")[1]:"application/zip"===e?"zip":"application/epub+zip"===e?"epub":"text/plain"===e?"txt":"application/pdf"===e?"pdf":"application/x-mobipocket-ebook"===e?"mobi":"application/vnd.amazon.ebook"===e?"azw3":"application/x-cbz"===e?"cbz":"application/x-cbr"===e?"cbr":"application/x-cbt"===e?"cbt":"application/x-cb7"===e?"cb7":"application/x-fictionbook+xml"===e?"fb2":"text/html"===e?"html":"text/css"===e?"css":"application/javascript"===e?"js":"application/xml"===e?"xml":"application/xhtml+xml"===e?"xhtml":"application/oebps-package+xml"===e?"opf":"application/x-dtbncx+xml"===e?"ncx":"audio/mpeg"===e?"mp3":"audio/wav"===e?"wav":"audio/ogg"===e?"ogg":"video/mp4"===e?"mp4":"video/webm"===e?"webm":"video/x-msvideo"===e?"avi":"video/x-ms-wmv"===e?"wmv":"video/x-flv"===e?"flv":"application/x-mpegURL"===e?"m3u8":"video/MP2T"===e?"ts":"video/3gpp"===e?"3gp":"video/3gpp2"===e?"3g2":"application/x-sqlite3"===e?"db":"",databaseList:h,configList:["themeColors","readingTime","appVersion","cloudSyncTime","lastSyncTime","recentBooks","koreaderBooks","recentAdd","deletedBooks","favoriteBooks","shelfList","txtParsers","aiModelConfig","readingStats","noteTags","recordLocation","thirdpartyToken","sortedShelfList","kindleDeviceList","thirdpartyToken","opdsCatalogs","opdsCatalogList"],copyArrayBuffer:e=>{var a=new ArrayBuffer(e.byteLength);return new Uint8Array(a).set(new Uint8Array(e)),a},base64ToArrayBuffer:g,arrayBufferToBase64:f,generateSHA256Hash:y,simpleEncrypt:function(e,a){if(!e||!a)return"";const t=N((new TextEncoder).encode(a)),o=Array.from(new Uint8Array(t)),i=(new TextEncoder).encode(e),n=new Uint8Array(i.length);for(let e=0;e{const a=new Set(["anthropic","zhipu","doubao","moonshot","deepseek","minimax","minimaxi"]),t=new Set(["qwen","hunyuan","siliconflow","siliconflowglobal","infini"]),o=new Set(["sensenova","openai"]),i=new Set(["ollama"]);return e&&"custom"!==e?a.has(e)?{thinking:{type:"disabled"}}:t.has(e)?{enable_thinking:!1}:o.has(e)?{reasoning_effort:"none"}:i.has(e)?{think:!1}:{}:{}},EmailProviders:["gmail.com","qq.com","163.com","yahoo.com","sina.com","sina.cn","126.com","outlook.com","yeah.net","foxmail.com","hotmail.com","protonmail.com","proton.me","icloud.com","mail.com","live.com","live.cn","msn.cn","msn.com","aliyun.com","sohu.com","yandex.com","naver.com","mail.ru","yahoo.co.jp","139.com","189.com","yandex.ru","189.cn"],Base64:v};const E={cloudUrl:"https://cloud.koodoreader.com",cloudCNUrl:"https://cloud.koodoreader.cn",testUrl:"https://cloudtest.960960.xyz",devUrl:"http://192.168.28.159:8000"},C={callbackUrl:"https://web.koodoreader.com/",cnCallbackUrl:"https://web.koodoreader.cn/",dropboxClientId:"vnc67byrssocvy1",yandexClientId:"e5305b62f53844b1994f77a840fd0a37",pcloudClientId:"pg8ten0B3vH",boxClientId:"ltimecqanmpxoaicn9qw3es6l3sdl1ya",duboxClientId:"kc0Ls6xLZugGgLLVhZ8yhUU1cRkRoKNU",yiyiwuClientId:"100197197",microsoftClientId:"506df58a-29ab-4020-afc5-6f423dc80f35",googleClientId:"1051055003225-ph1f5fvh328dhv7bco5jitlnfhg6ks2t.apps.googleusercontent.com",appleClientId:"com.koodoreader.auth",facebookClientId:"2845583825559500",githubClientId:"Ov23liJVzfvJMMEEZ8v2",adriveClientId:"a128ae7b9c094545af623de61dc0a1ef"},T={google:{clientId:C.googleClientId,scopes:["openid email profile"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"openid email profile"}},microsoft:{clientId:C.microsoftClientId,scopes:["openid","profile","User.Read","offline_access"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"openid profile User.Read offline_access"}},facebook:{clientId:C.facebookClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:""}},github:{clientId:C.githubClientId,scopes:["user:email"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"user:email"}},apple:{clientId:C.appleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{}},email:{clientId:"",scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:""}}},w=["backgroundColor","textColor","fontSize","margin","letterSpacing","paraSpacing","scale","brightness","fontFamily","subFontFamily","lineHeight","textAlign","textOrientation","convertChinese","selectAction","fullTranslationMode","readerMode","pdfReaderMode","isBold","isIndent","isSliding","isUnderline","isShadow","isItalic","isInvert","isBionic","isHyphenation","isOrphanWidow","isKeepPDFBackground","isAllowScript","isStartFromEven"];var A={CloudMode:"production",CloudConfig:E,ConvertLangMap:{en:"English",zhCN:"Chinese",zhTW:"Chinese",zhMO:"Chinese",tr:"Turkish",ar:"Arabic",ro:"Romanian",pl:"Polish",cs:"Czech",ja:"Japanese",ta:"Tamil",uk:"Ukrainian",sl:"Slovenian",bo:"Tibetan",id:"Indonesian",hy:"Armenian",el:"Greek",hu:"Hungarian",hi:"Hindi",bg:"Bulgarian",nl:"Dutch",it:"Italian",bn:"Bengali",tl:"Tagalog",sv:"Swedish",ga:"Irish",ko:"Korean",de:"German",ru:"Russian",es:"Spanish",fr:"French",fa:"Persian",ptBR:"Portuguese",th:"Thai",sr:"Serbian",am:"Amharic",da:"Danish",fi:"Finnish",ie:"Interlingue",pt:"Portuguese",vi:"Vietnamese"},ContentRegxConfig:[{label:"Default parser",value:"Default parser",subtitle:"Suitable for most txt files",regex:""},{label:"Chinese novel parser",value:"Chinese novel parser",subtitle:"Suitable for most Chinese novels, eg. 第一章,第2回",regex:"^\\s*(第[0-9一二三四五六七八九十百千万零壹贰叁肆伍陆柒捌玖拾佰仟]+[章回])\\s*"},{label:"English novel parser",value:"English novel parser",subtitle:"Suitable for most English novels, eg. Chapter 1, Part II",regex:"^\\s*(Chapter|Part|Book|CHAPTER|PART|BOOK)\\s*"},{label:"Number parser",value:"Number parser",subtitle:"Suitable for novels with number chapter titles, eg. 1, 2, 3",regex:"^\\s*([0-9]+[\\s.、::·\\-—]+|[一二三四五六七八九十百千万零]+[\\s.、::·\\-—]+).+"}],StyleKeys:w,ThirdpartyConfig:C,LoginAuthRequest:T,LoginDiscovery:{microsoft:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"},facebook:{authorizationEndpoint:"https://www.facebook.com/v12.0/dialog/oauth",tokenEndpoint:"https://graph.facebook.com/v12.0/oauth/access_token"},github:{authorizationEndpoint:"https://github.com/login/oauth/authorize",tokenEndpoint:"https://github.com/login/oauth/access_token"},apple:{authorizationEndpoint:"https://appleid.apple.com/auth/authorize",tokenEndpoint:"https://appleid.apple.com/auth/token"},email:{authorizationEndpoint:"",tokenEndpoint:""}},DriveAuthRequest:{dropbox:{clientId:C.dropboxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{token_access_type:"offline"}},yandex:{clientId:C.yandexClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code",force_confirm:"true"}},boxnet:{clientId:C.boxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}},pcloud:{clientId:C.pcloudClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code"}},dubox:{clientId:C.duboxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code",scope:"basic,netdisk",device_id:"119827642",qrcode:"1"}},yiyiwu:{clientId:C.yiyiwuClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code"}},adrive:{clientId:C.adriveClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}},microsoft:{clientId:C.microsoftClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"files.readwrite.appfolder offline_access"}},google:{clientId:C.googleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"https://www.googleapis.com/auth/drive.file",access_type:"offline"}},microsoft_exp:{clientId:C.microsoftClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"files.readwrite.all offline_access"}},google_exp:{clientId:C.googleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"https://www.googleapis.com/auth/drive",access_type:"offline"}}},DriveDiscovery:{dropbox:{authorizationEndpoint:"https://www.dropbox.com/oauth2/authorize",tokenEndpoint:"https://www.dropbox.com/oauth2/token"},yandex:{authorizationEndpoint:"https://oauth.yandex.com/authorize",tokenEndpoint:"https://oauth.yandex.com/token"},boxnet:{authorizationEndpoint:"https://account.box.com/api/oauth2/authorize",tokenEndpoint:"https://api.box.com/oauth2/token"},pcloud:{authorizationEndpoint:"https://my.pcloud.com/oauth2/authorize",tokenEndpoint:"https://api.pcloud.com/oauth2_token"},dubox:{authorizationEndpoint:"https://openapi.baidu.com/oauth/2.0/authorize",tokenEndpoint:"https://openapi.baidu.com/oauth/2.0/token"},yiyiwu:{authorizationEndpoint:"https://passportapi.115.com/open/authorize",tokenEndpoint:"https://passportapi.115.com/open/authorize"},adrive:{authorizationEndpoint:"https://openapi.alipan.com/oauth/authorize",tokenEndpoint:"https://openapi.alipan.com/oauth/token"},microsoft:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"},microsoft_exp:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google_exp:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"}},AiProviderList:[{id:"custom",name:"Custom model",defaultEndpoint:"",modelsEndpoint:"",isCNAvailable:!0},{id:"openai",name:"OpenAI",defaultEndpoint:"https://api.openai.com/v1",modelsEndpoint:"https://api.openai.com/v1/models"},{id:"anthropic",name:"Anthropic",defaultEndpoint:"https://api.anthropic.com/v1",modelsEndpoint:"https://api.anthropic.com/v1/models"},{id:"google",name:"Google Gemini",defaultEndpoint:"https://generativelanguage.googleapis.com/v1beta/openai",modelsEndpoint:"https://generativelanguage.googleapis.com/v1beta/openai/models"},{id:"deepseek",name:"DeepSeek",defaultEndpoint:"https://api.deepseek.com/v1",modelsEndpoint:"https://api.deepseek.com/v1/models",isCNAvailable:!0},{id:"mistral",name:"Mistral AI",defaultEndpoint:"https://api.mistral.ai/v1",modelsEndpoint:"https://api.mistral.ai/v1/models"},{id:"cohere",name:"Cohere",defaultEndpoint:"https://api.cohere.ai/compatibility/v1",modelsEndpoint:"https://api.cohere.ai/compatibility/v1/models"},{id:"groq",name:"Groq",defaultEndpoint:"https://api.groq.com/openai/v1",modelsEndpoint:"https://api.groq.com/openai/v1/models"},{id:"together",name:"Together AI",defaultEndpoint:"https://api.together.xyz/v1",modelsEndpoint:"https://api.together.xyz/v1/models"},{id:"fireworks",name:"Fireworks AI",defaultEndpoint:"https://api.fireworks.ai/inference/v1",modelsEndpoint:"https://api.fireworks.ai/inference/v1/models"},{id:"perplexity",name:"Perplexity",defaultEndpoint:"https://api.perplexity.ai",modelsEndpoint:"https://api.perplexity.ai/v1/models"},{id:"openrouter",name:"OpenRouter",defaultEndpoint:"https://openrouter.ai/api/v1",modelsEndpoint:"https://openrouter.ai/api/v1/models"},{id:"ai21",name:"AI21 Labs",defaultEndpoint:"https://api.ai21.com/studio/v1",modelsEndpoint:"https://api.ai21.com/studio/v1/models"},{id:"xai",name:"xAI (Grok)",defaultEndpoint:"https://api.x.ai/v1",modelsEndpoint:"https://api.x.ai/v1/models"},{id:"sambanova",name:"SambaNova",defaultEndpoint:"https://api.sambanova.ai/v1",modelsEndpoint:"https://api.sambanova.ai/v1/models"},{id:"cerebras",name:"Cerebras",defaultEndpoint:"https://api.cerebras.ai/v1",modelsEndpoint:"https://api.cerebras.ai/v1/models"},{id:"hyperbolic",name:"Hyperbolic",defaultEndpoint:"https://api.hyperbolic.xyz/v1",modelsEndpoint:"https://api.hyperbolic.xyz/v1/models"},{id:"novita",name:"Novita AI",defaultEndpoint:"https://api.novita.ai/openai",modelsEndpoint:"https://api.novita.ai/openai/models"},{id:"lepton",name:"Lepton AI",defaultEndpoint:"https://llm.lepton.run/api/v1",modelsEndpoint:"https://llm.lepton.run/api/v1/models"},{id:"deepinfra",name:"DeepInfra",defaultEndpoint:"https://api.deepinfra.com/v1/openai",modelsEndpoint:"https://api.deepinfra.com/v1/openai/models"},{id:"replicate",name:"Replicate",defaultEndpoint:"https://api.replicate.com/v1",modelsEndpoint:"https://api.replicate.com/v1/models"},{id:"zhipu",name:"Zhipu AI (智谱)",defaultEndpoint:"https://open.bigmodel.cn/api/paas/v4",modelsEndpoint:"https://open.bigmodel.cn/api/paas/v4/models",isCNAvailable:!0},{id:"qwen",name:"Alibaba Qwen (通义千问)",defaultEndpoint:"https://dashscope.aliyuncs.com/compatible-mode/v1",modelsEndpoint:"https://dashscope.aliyuncs.com/compatible-mode/v1/models",isCNAvailable:!0},{id:"moonshot",name:"Moonshot (月之暗面)",defaultEndpoint:"https://api.moonshot.cn/v1",modelsEndpoint:"https://api.moonshot.cn/v1/models",isCNAvailable:!0},{id:"baidu",name:"Baidu ERNIE (文心一言)",defaultEndpoint:"https://qianfan.baidubce.com/v2",modelsEndpoint:"https://qianfan.baidubce.com/v2/models",isCNAvailable:!0},{id:"doubao",name:"Volcengine Doubao (豆包)",defaultEndpoint:"https://ark.cn-beijing.volces.com/api/v3",modelsEndpoint:"https://ark.cn-beijing.volces.com/api/v3/models",isCNAvailable:!0},{id:"spark",name:"iFlytek Spark (讯飞星火)",defaultEndpoint:"https://spark-api-open.xf-yun.com/v1",modelsEndpoint:"https://spark-api-open.xf-yun.com/v1/models",isCNAvailable:!0},{id:"hunyuan",name:"Tencent Hunyuan (腾讯混元)",defaultEndpoint:"https://api.hunyuan.cloud.tencent.com/v1",modelsEndpoint:"https://api.hunyuan.cloud.tencent.com/v1/models",isCNAvailable:!0},{id:"minimaxi",name:"MiniMax (国内版)",defaultEndpoint:"https://api.minimaxi.com/v1",modelsEndpoint:"https://api.minimaxi.com/v1/models",isCNAvailable:!0},{id:"minimax",name:"MiniMax (国际版)",defaultEndpoint:"https://api.minimax.io/v1",modelsEndpoint:"https://api.minimax.io/v1/models"},{id:"baichuan",name:"Baichuan (百川)",defaultEndpoint:"https://api.baichuan-ai.com/v1",modelsEndpoint:"https://api.baichuan-ai.com/v1/models",isCNAvailable:!0},{id:"stepfun",name:"StepFun (阶跃星辰)",defaultEndpoint:"https://api.stepfun.com/v1",modelsEndpoint:"https://api.stepfun.com/v1/models",isCNAvailable:!0},{id:"lingyi",name:"Lingyiwanwu (零一万物)",defaultEndpoint:"https://api.lingyiwanwu.com/v1",modelsEndpoint:"https://api.lingyiwanwu.com/v1/models",isCNAvailable:!0},{id:"siliconflow",name:"SiliconFlow (硅基流动)",defaultEndpoint:"https://api.siliconflow.cn/v1",modelsEndpoint:"https://api.siliconflow.cn/v1/models",isCNAvailable:!0},{id:"siliconflowglobal",name:"SiliconFlow (国际版)",defaultEndpoint:"https://api.siliconflow.com/v1",modelsEndpoint:"https://api.siliconflow.com/v1/models"},{id:"sensenova",name:"SenseNova (日日新)",defaultEndpoint:"https://token.sensenova.cn/v1",modelsEndpoint:"https://token.sensenova.cn/v1/models",isCNAvailable:!0},{id:"infini",name:"Infini AI (无问芯穹)",defaultEndpoint:"https://cloud.infini-ai.com/maas/v1",modelsEndpoint:"https://cloud.infini-ai.com/maas/v1/models",isCNAvailable:!0},{id:"ollama",name:"Ollama (Local)",defaultEndpoint:"http://localhost:11434/v1",modelsEndpoint:"http://localhost:11434/v1/models",isCNAvailable:!0},{id:"lmstudio",name:"LM Studio (Local)",defaultEndpoint:"http://localhost:1234/v1",modelsEndpoint:"http://localhost:1234/v1/models",isCNAvailable:!0},{id:"vllm",name:"vLLM (Local)",defaultEndpoint:"http://localhost:8000/v1",modelsEndpoint:"http://localhost:8000/v1/models",isCNAvailable:!0},{id:"azure",name:"Azure OpenAI",defaultEndpoint:"",modelsEndpoint:""},{id:"aws_bedrock",name:"AWS Bedrock",defaultEndpoint:"",modelsEndpoint:""}],DefaultPrompts:{aiTranslate:"You are a professional translator. Translate the following text from {from} to {to}. Only return the translated text, no explanations.\n\nText: {text}",aiDict:"You are a professional dictionary assistant. Analyze the word or phrase: {word}\nProvide a comprehensive explanation including pronunciation, definitions, example sentences, and usage notes using {to} as the target language. ",aiAssistance:"You are a helpful reading assistant. The user is reading a book. Here is the context:\n{text}\n\nAnswer the user's question concisely and helpfully, and reply with the same language."},SpeechList:[{label:"English",code:"en",example:"To be, or not to be, that is the question."},{label:"Simplified Chinese",code:"zh",example:"千里之行,始于足下。"},{label:"Japanese",code:"ja",example:"猿も木から落ちる。"},{label:"Korean",code:"ko",example:"가는 날이 장날이다."},{label:"French",code:"fr",example:"Liberté, égalité, fraternité."},{label:"German",code:"de",example:"Der Weg ist das Ziel."},{label:"Spanish",code:"es",example:"La vida es un sueño."},{label:"Italian",code:"it",example:"Dolce far niente."},{label:"Russian",code:"ru",example:"Век живи, век учись."},{label:"Portuguese",code:"pt",example:"Saudade é um sentimento profundo."},{label:"Hindi",code:"hi",example:"सपने वो नहीं जो हम सोते वक्त देखते हैं।"},{label:"Afrikaans",code:"af",example:"Die lewe is 'n geskenk."},{label:"Amharic",code:"am",example:"ዕውቀት ብርሃን ነው።"},{label:"Arabic",code:"ar",example:"العلم نور والجهل ظلام."},{label:"Azerbaijani",code:"az",example:"Elm işıqdır, cəhalət zülmət."},{label:"Bulgarian",code:"bg",example:"Знанието е сила."},{label:"Bengali",code:"bn",example:"জ্ঞানই শক্তি।"},{label:"Bosnian",code:"bs",example:"Znanje je moć."},{label:"Catalan",code:"ca",example:"El saber no ocupa lloc."},{label:"Czech",code:"cs",example:"Bez práce nejsou koláče."},{label:"Welsh",code:"cy",example:"Nid aur popeth melyn."},{label:"Danish",code:"da",example:"Lykken er ikke et sted, men en retning."},{label:"Greek",code:"el",example:"Η γνώση είναι δύναμη."},{label:"Estonian",code:"et",example:"Teadmine on jõud."},{label:"Basque",code:"eu",example:"Jakitea boterea da."},{label:"Persian",code:"fa",example:"دانش قدرت است."},{label:"Finnish",code:"fi",example:"Tieto on valtaa."},{label:"Filipino",code:"fil",example:"Ang kaalaman ay kapangyarihan."},{label:"Irish",code:"ga",example:"Is fearr Gaeilge briste ná Béarla cliste."},{label:"Galician",code:"gl",example:"O saber non ocupa lugar."},{label:"Gujarati",code:"gu",example:"જ્ઞાન શક્તિ છે."},{label:"Hebrew",code:"he",example:"ידע הוא כוח."},{label:"Croatian",code:"hr",example:"Znanje je moć."},{label:"Hungarian",code:"hu",example:"A tudás hatalom."},{label:"Armenian",code:"hy",example:"Գիտելիքը ուժ է."},{label:"Indonesian",code:"id",example:"Pengetahuan adalah kekuatan."},{label:"Icelandic",code:"is",example:"Þekking er máttur."},{label:"Inuktitut",code:"iu",example:"ᐃᓕᓐᓂᐊᕐᓂᖅ ᐱᒻᒪᕆᐅᕗᖅ."},{label:"Javanese",code:"jv",example:"Ilmu iku kelakone kanthi laku."},{label:"Georgian",code:"ka",example:"ცოდნა ძალაა."},{label:"Kazakh",code:"kk",example:"Білім — күш."},{label:"Khmer",code:"km",example:"ចំណេះដឹងគឺជាអំណាច។"},{label:"Kannada",code:"kn",example:"ಜ್ಞಾನವೇ ಶಕ್ತಿ."},{label:"Lao",code:"lo",example:"ຄວາມຮູ້ຄືພະລັງ."},{label:"Lithuanian",code:"lt",example:"Žinios yra jėga."},{label:"Latvian",code:"lv",example:"Zināšanas ir spēks."},{label:"Macedonian",code:"mk",example:"Знаењето е моќ."},{label:"Malayalam",code:"ml",example:"അറിവ് ശക്തിയാണ്."},{label:"Mongolian",code:"mn",example:"Мэдлэг бол хүч."},{label:"Marathi",code:"mr",example:"ज्ञान हीच शक्ती आहे."},{label:"Malay",code:"ms",example:"Ilmu itu cahaya."},{label:"Maltese",code:"mt",example:"L-għarfien huwa l-poter."},{label:"Burmese",code:"my",example:"ဗဟုသုတသည် အားဖြစ်သည်။"},{label:"Norwegian",code:"nb",example:"Kunnskap er makt."},{label:"Nepali",code:"ne",example:"ज्ञान नै शक्ति हो।"},{label:"Dutch",code:"nl",example:"Kennis is macht."},{label:"Odia",code:"or",example:"ଜ୍ଞାନ ହିଁ ଶକ୍ତି।"},{label:"Punjabi",code:"pa",example:"ਗਿਆਨ ਹੀ ਸ਼ਕਤੀ ਹੈ।"},{label:"Polish",code:"pl",example:"Wiedza to potęga."},{label:"Pashto",code:"ps",example:"د پوهې ډیوه روښانه ده."},{label:"Romanian",code:"ro",example:"Cartea este o comoară."},{label:"Sinhala",code:"si",example:"දැනුම බලයකි."},{label:"Slovak",code:"sk",example:"Vedomosti sú sila."},{label:"Slovenian",code:"sl",example:"Znanje je moč."},{label:"Somali",code:"so",example:"Aqoontu waa iftiin."},{label:"Albanian",code:"sq",example:"Dija është fuqi."},{label:"Serbian",code:"sr",example:"Знање је моћ."},{label:"Sundanese",code:"su",example:"Élmu éta cahaya."},{label:"Swedish",code:"sv",example:"Kunskap är makt."},{label:"Swahili",code:"sw",example:"Maarifa ni nguvu."},{label:"Tamil",code:"ta",example:"அறிவே ஆற்றல்."},{label:"Telugu",code:"te",example:"జ్ఞానమే శక్తి."},{label:"Thai",code:"th",example:"ความรู้คือพลัง."},{label:"Turkish",code:"tr",example:"Bilgi güçtür."},{label:"Ukrainian",code:"uk",example:"Знання — сила."},{label:"Urdu",code:"ur",example:"علم ہی طاقت ہے۔"},{label:"Uzbek",code:"uz",example:"Bilim – kuch."},{label:"Vietnamese",code:"vi",example:"Học vấn là sức mạnh."},{label:"Wu Chinese",code:"wuu",example:"学问是力量。"},{label:"Cantonese",code:"yue",example:"知識就係力量。"},{label:"Zulu",code:"zu",example:"Ulwazi lungamandla."}],HighlightStyleTypes:[{value:"background",label:"Highlight background"},{value:"underline",label:"Underline"},{value:"strikethrough",label:"Strikethrough"},{value:"wavy",label:"Wavy underline"}],HighlightPresetColors:{background:["#F3C9C9","#FEF3CD","#CEFACD","#CDE9FA"],underline:["#FF0000","#60A5FA","#FF9900","#2EFF2E"],strikethrough:["#FF0000","#60A5FA","#FF9900","#2EFF2E"],wavy:["#FF0000","#60A5FA","#FF9900","#2EFF2E"]},PresetThemeList:[{key:"yellow",textColor:"rgba(89, 68, 41,1)",backgroundColor:"rgba(233, 216, 188,1)",title:"羊皮"},{key:"green",textColor:"rgba(54, 80, 62,1)",backgroundColor:"rgba(197, 231, 207,1)",title:"护眼"},{key:"light",textColor:"rgba(0,0,0,1)",backgroundColor:"rgba(255,255,255,1)",title:"白天"},{key:"night",textColor:"rgba(255,255,255,1)",backgroundColor:"rgba(44,47,49,1)",title:"黑夜"},{key:"sepia",textColor:"rgba(93, 64, 55,1)",backgroundColor:"rgba(245, 235, 220,1)",title:"古卷"},{key:"blue",textColor:"rgba(28, 52, 84,1)",backgroundColor:"rgba(230, 240, 250,1)",title:"晨雾"},{key:"purple",textColor:"rgba(68, 42, 84,1)",backgroundColor:"rgba(240, 230, 250,1)",title:"紫萝"},{key:"pink",textColor:"rgba(84, 42, 68,1)",backgroundColor:"rgba(250, 235, 245,1)",title:"樱花"},{key:"brown",textColor:"rgba(74, 54, 42,1)",backgroundColor:"rgba(240, 230, 215,1)",title:"木纹"},{key:"gray",textColor:"rgba(64, 64, 64,1)",backgroundColor:"rgba(240, 240, 240,1)",title:"素雅"},{key:"darkgreen",textColor:"rgba(200, 220, 200,1)",backgroundColor:"rgba(25, 35, 30,1)",title:"深林"},{key:"darkblue",textColor:"rgba(200, 210, 230,1)",backgroundColor:"rgba(20, 30, 45,1)",title:"深海"},{key:"coral",textColor:"rgba(84, 50, 42,1)",backgroundColor:"rgba(255, 235, 230,1)",title:"珊瑚"},{key:"mint",textColor:"rgba(42, 74, 64,1)",backgroundColor:"rgba(230, 250, 245,1)",title:"薄荷"},{key:"lavender",textColor:"rgba(54, 42, 74,1)",backgroundColor:"rgba(245, 240, 255,1)",title:"薰衣"},{key:"cream",textColor:"rgba(74, 64, 42,1)",backgroundColor:"rgba(255, 250, 240,1)",title:"奶油"},{key:"darkbrown",textColor:"rgba(230, 215, 200,1)",backgroundColor:"rgba(35, 25, 20,1)",title:"深棕"},{key:"olive",textColor:"rgba(64, 74, 42,1)",backgroundColor:"rgba(240, 245, 230,1)",title:"橄榄"},{key:"rose",textColor:"rgba(84, 42, 54,1)",backgroundColor:"rgba(255, 240, 245,1)",title:"玫瑰"},{key:"slate",textColor:"rgba(54, 64, 74,1)",backgroundColor:"rgba(235, 240, 245,1)",title:"石板"}],OfficialVoiceList:[{name:"af_alloy",gender:"female",displayName:"Alloy",locale:"en-US",language:"English (US)"},{name:"af_aoede",gender:"female",displayName:"Aoede",locale:"en-US",language:"English (US)"},{name:"af_bella",gender:"female",displayName:"Bella",locale:"en-US",language:"English (US)"},{name:"af_heart",gender:"female",displayName:"Heart",locale:"en-US",language:"English (US)"},{name:"af_jessica",gender:"female",displayName:"Jessica",locale:"en-US",language:"English (US)"},{name:"af_kore",gender:"female",displayName:"Kore",locale:"en-US",language:"English (US)"},{name:"af_nicole",gender:"female",displayName:"Nicole",locale:"en-US",language:"English (US)"},{name:"af_nova",gender:"female",displayName:"Nova",locale:"en-US",language:"English (US)"},{name:"af_river",gender:"female",displayName:"River",locale:"en-US",language:"English (US)"},{name:"af_sarah",gender:"female",displayName:"Sarah",locale:"en-US",language:"English (US)"},{name:"af_sky",gender:"female",displayName:"Sky",locale:"en-US",language:"English (US)"},{name:"am_adam",gender:"male",displayName:"Adam",locale:"en-US",language:"English (US)"},{name:"am_echo",gender:"male",displayName:"Echo",locale:"en-US",language:"English (US)"},{name:"am_eric",gender:"male",displayName:"Eric",locale:"en-US",language:"English (US)"},{name:"am_fenrir",gender:"male",displayName:"Fenrir",locale:"en-US",language:"English (US)"},{name:"am_liam",gender:"male",displayName:"Liam",locale:"en-US",language:"English (US)"},{name:"am_michael",gender:"male",displayName:"Michael",locale:"en-US",language:"English (US)"},{name:"am_onyx",gender:"male",displayName:"Onyx",locale:"en-US",language:"English (US)"},{name:"am_puck",gender:"male",displayName:"Puck",locale:"en-US",language:"English (US)"},{name:"am_santa",gender:"male",displayName:"Santa",locale:"en-US",language:"English (US)"},{name:"bf_alice",gender:"female",displayName:"Alice",locale:"en-GB",language:"English (UK)"},{name:"bf_emma",gender:"female",displayName:"Emma",locale:"en-GB",language:"English (UK)"},{name:"bf_isabella",gender:"female",displayName:"Isabella",locale:"en-GB",language:"English (UK)"},{name:"bf_lily",gender:"female",displayName:"Lily",locale:"en-GB",language:"English (UK)"},{name:"bm_daniel",gender:"male",displayName:"Daniel",locale:"en-GB",language:"English (UK)"},{name:"bm_fable",gender:"male",displayName:"Fable",locale:"en-GB",language:"English (UK)"},{name:"bm_george",gender:"male",displayName:"George",locale:"en-GB",language:"English (UK)"},{name:"bm_lewis",gender:"male",displayName:"Lewis",locale:"en-GB",language:"English (UK)"},{name:"ef_dora",gender:"female",displayName:"Dora",locale:"es-ES",language:"Español"},{name:"em_alex",gender:"male",displayName:"Alex",locale:"es-ES",language:"Español"},{name:"em_santa",gender:"male",displayName:"Santa",locale:"es-ES",language:"Español"},{name:"ff_siwis",gender:"female",displayName:"Siwis",locale:"fr-FR",language:"Français"},{name:"hf_alpha",gender:"female",displayName:"Alpha",locale:"hi-IN",language:"हिन्दी"},{name:"hf_beta",gender:"female",displayName:"Beta",locale:"hi-IN",language:"हिन्दी"},{name:"hm_omega",gender:"male",displayName:"Omega",locale:"hi-IN",language:"हिन्दी"},{name:"hm_psi",gender:"male",displayName:"Psi",locale:"hi-IN",language:"हिन्दी"},{name:"if_sara",gender:"female",displayName:"Sara",locale:"it-IT",language:"Italiano"},{name:"im_nicola",gender:"male",displayName:"Nicola",locale:"it-IT",language:"Italiano"},{name:"jf_alpha",gender:"female",displayName:"Alpha",locale:"ja-JP",language:"日本語"},{name:"jf_gongitsune",gender:"female",displayName:"Gongitsune",locale:"ja-JP",language:"日本語"},{name:"jf_nezumi",gender:"female",displayName:"Nezumi",locale:"ja-JP",language:"日本語"},{name:"jf_tebukuro",gender:"female",displayName:"Tebukuro",locale:"ja-JP",language:"日本語"},{name:"jm_kumo",gender:"male",displayName:"Kumo",locale:"ja-JP",language:"日本語"},{name:"pf_dora",gender:"female",displayName:"Dora",locale:"pt-BR",language:"Português (Brasil)"},{name:"pm_alex",gender:"male",displayName:"Alex",locale:"pt-BR",language:"Português (Brasil)"},{name:"pm_santa",gender:"male",displayName:"Santa",locale:"pt-BR",language:"Português (Brasil)"},{name:"zf_xiaoxiao",gender:"female",displayName:"Xiaoxiao",locale:"zh-CN",language:"中文"},{name:"zm_yunxi",gender:"male",displayName:"Yunxi",locale:"zh-CN",language:"中文"},{name:"zf_xiaoyi",gender:"female",displayName:"Xiaoyi",locale:"zh-CN",language:"中文"},{name:"zm_yunyang",gender:"male",displayName:"Yunyang",locale:"zh-CN",language:"中文"},{name:"zm_yunxia",gender:"male",displayName:"Yunxia",locale:"zh-CN",language:"中文"},{name:"zm_yunjian",gender:"male",displayName:"Yunjian",locale:"zh-CN",language:"中文"},{name:"zf_xiaoni",gender:"female",displayName:"Xiaoni 陕西",locale:"zh-CN",language:"中文"},{name:"zf_xiaobei",gender:"female",displayName:"Xiaobei 辽宁",locale:"zh-CN",language:"中文"}],AzureTTSVoiceList:[{name:"de-DE-AmalaNeural",gender:"female",displayName:"Amala",locale:"de-DE"},{name:"de-DE-BerndNeural",gender:"male",displayName:"Bernd",locale:"de-DE"},{name:"de-DE-ConradNeural",gender:"male",displayName:"Conrad",locale:"de-DE"},{name:"de-DE-KatjaNeural",gender:"female",displayName:"Katja",locale:"de-DE"},{name:"en-GB-LibbyNeural",gender:"female",displayName:"Libby",locale:"en-GB"},{name:"en-GB-RyanNeural",gender:"male",displayName:"Ryan",locale:"en-GB"},{name:"en-GB-SoniaNeural",gender:"female",displayName:"Sonia",locale:"en-GB"},{name:"en-US-AmberNeural",gender:"female",displayName:"Amber",locale:"en-US"},{name:"en-US-AriaNeural",gender:"female",displayName:"Aria",locale:"en-US"},{name:"en-US-ChristopherNeural",gender:"male",displayName:"Christopher",locale:"en-US"},{name:"en-US-DavisNeural",gender:"male",displayName:"Davis",locale:"en-US"},{name:"en-US-EricNeural",gender:"male",displayName:"Eric",locale:"en-US"},{name:"en-US-GuyNeural",gender:"male",displayName:"Guy",locale:"en-US"},{name:"en-US-JaneNeural",gender:"female",displayName:"Jane",locale:"en-US"},{name:"en-US-JennyNeural",gender:"female",displayName:"Jenny",locale:"en-US"},{name:"en-US-MichelleNeural",gender:"female",displayName:"Michelle",locale:"en-US"},{name:"en-US-SaraNeural",gender:"female",displayName:"Sara",locale:"en-US"},{name:"es-ES-AbrilNeural",gender:"female",displayName:"Abril",locale:"es-ES"},{name:"es-ES-AlvaroNeural",gender:"male",displayName:"Álvaro",locale:"es-ES"},{name:"es-ES-ArnauNeural",gender:"male",displayName:"Arnau",locale:"es-ES"},{name:"es-ES-ElviraNeural",gender:"female",displayName:"Elvira",locale:"es-ES"},{name:"fr-FR-DeniseNeural",gender:"female",displayName:"Denise",locale:"fr-FR"},{name:"fr-FR-HenriNeural",gender:"male",displayName:"Henri",locale:"fr-FR"},{name:"it-IT-BenignoNeural",gender:"male",displayName:"Benigno",locale:"it-IT"},{name:"it-IT-DiegoNeural",gender:"male",displayName:"Diego",locale:"it-IT"},{name:"it-IT-ElsaNeural",gender:"female",displayName:"Elsa",locale:"it-IT"},{name:"it-IT-IsabellaNeural",gender:"female",displayName:"Isabella",locale:"it-IT"},{name:"ja-JP-KeitaNeural",gender:"male",displayName:"圭太",locale:"ja-JP"},{name:"ja-JP-NanamiNeural",gender:"female",displayName:"七海",locale:"ja-JP"},{name:"ko-KR-InJoonNeural",gender:"male",displayName:"인준",locale:"ko-KR"},{name:"ko-KR-SoonBokNeural",gender:"female",displayName:"순복",locale:"ko-KR"},{name:"ko-KR-SunHiNeural",gender:"female",displayName:"선히",locale:"ko-KR"},{name:"pt-BR-AntonioNeural",gender:"male",displayName:"Antônio",locale:"pt-BR"},{name:"pt-BR-FranciscaNeural",gender:"female",displayName:"Francisca",locale:"pt-BR"},{name:"pt-PT-DuarteNeural",gender:"male",displayName:"Duarte",locale:"pt-PT"},{name:"pt-PT-RaquelNeural",gender:"female",displayName:"Raquel",locale:"pt-PT"},{name:"ru-RU-DariyaNeural",gender:"female",displayName:"Дария",locale:"ru-RU"},{name:"ru-RU-DmitryNeural",gender:"male",displayName:"Дмитрий",locale:"ru-RU"},{name:"ru-RU-SvetlanaNeural",gender:"female",displayName:"Светлана",locale:"ru-RU"},{name:"yue-CN-XiaoMinNeural",gender:"female",displayName:"晓敏",locale:"yue-CN"},{name:"yue-CN-YunSongNeural",gender:"male",displayName:"云松",locale:"yue-CN"},{name:"zh-CN-XiaoxiaoNeural",gender:"female",displayName:"晓晓",locale:"zh-CN"},{name:"zh-CN-YunxiNeural",gender:"male",displayName:"云希",locale:"zh-CN"},{name:"zh-HK-HiuMaanNeural",gender:"female",displayName:"曉曼",locale:"zh-HK"},{name:"zh-HK-WanLungNeural",gender:"male",displayName:"雲龍",locale:"zh-HK"},{name:"zh-TW-HsiaoChenNeural",gender:"female",displayName:"曉臻",locale:"zh-TW"},{name:"zh-TW-YunJheNeural",gender:"male",displayName:"雲哲",locale:"zh-TW"},{name:"af-ZA-AdriNeural",gender:"female",displayName:"Adri",locale:"af-ZA"},{name:"af-ZA-WillemNeural",gender:"male",displayName:"Willem",locale:"af-ZA"},{name:"sq-AL-AnilaNeural",gender:"female",displayName:"Anila",locale:"sq-AL"},{name:"sq-AL-IlirNeural",gender:"male",displayName:"Ilir",locale:"sq-AL"},{name:"am-ET-AmehaNeural",gender:"male",displayName:"አምሀ",locale:"am-ET"},{name:"am-ET-MekdesNeural",gender:"female",displayName:"መቅደስ",locale:"am-ET"},{name:"ar-DZ-AminaNeural",gender:"female",displayName:"أمينة",locale:"ar-DZ"},{name:"ar-DZ-IsmaelNeural",gender:"male",displayName:"إسماعيل",locale:"ar-DZ"},{name:"ar-BH-AliNeural",gender:"male",displayName:"علي",locale:"ar-BH"},{name:"ar-BH-LailaNeural",gender:"female",displayName:"ليلى",locale:"ar-BH"},{name:"ar-EG-SalmaNeural",gender:"female",displayName:"سلمى",locale:"ar-EG"},{name:"ar-EG-ShakirNeural",gender:"male",displayName:"شاكر",locale:"ar-EG"},{name:"ar-IQ-BasselNeural",gender:"male",displayName:"باسل",locale:"ar-IQ"},{name:"ar-IQ-RanaNeural",gender:"female",displayName:"رنا",locale:"ar-IQ"},{name:"ar-JO-SanaNeural",gender:"female",displayName:"سناء",locale:"ar-JO"},{name:"ar-JO-TaimNeural",gender:"male",displayName:"تيم",locale:"ar-JO"},{name:"ar-KW-FahedNeural",gender:"male",displayName:"فهد",locale:"ar-KW"},{name:"ar-KW-NouraNeural",gender:"female",displayName:"نورا",locale:"ar-KW"},{name:"ar-LB-LaylaNeural",gender:"female",displayName:"ليلى",locale:"ar-LB"},{name:"ar-LB-RamiNeural",gender:"male",displayName:"رامي",locale:"ar-LB"},{name:"ar-LY-ImanNeural",gender:"female",displayName:"إيمان",locale:"ar-LY"},{name:"ar-LY-OmarNeural",gender:"male",displayName:"أحمد",locale:"ar-LY"},{name:"ar-MA-JamalNeural",gender:"male",displayName:"جمال",locale:"ar-MA"},{name:"ar-MA-MounaNeural",gender:"female",displayName:"منى",locale:"ar-MA"},{name:"ar-OM-AbdullahNeural",gender:"male",displayName:"عبدالله",locale:"ar-OM"},{name:"ar-OM-AyshaNeural",gender:"female",displayName:"عائشة",locale:"ar-OM"},{name:"ar-QA-AmalNeural",gender:"female",displayName:"أمل",locale:"ar-QA"},{name:"ar-QA-MoazNeural",gender:"male",displayName:"معاذ",locale:"ar-QA"},{name:"ar-SA-HamedNeural",gender:"male",displayName:"حامد",locale:"ar-SA"},{name:"ar-SA-ZariyahNeural",gender:"female",displayName:"زارية",locale:"ar-SA"},{name:"ar-SY-AmanyNeural",gender:"female",displayName:"أماني",locale:"ar-SY"},{name:"ar-SY-LaithNeural",gender:"male",displayName:"ليث",locale:"ar-SY"},{name:"ar-TN-HediNeural",gender:"male",displayName:"هادي",locale:"ar-TN"},{name:"ar-TN-ReemNeural",gender:"female",displayName:"ريم",locale:"ar-TN"},{name:"ar-AE-FatimaNeural",gender:"female",displayName:"فاطمة",locale:"ar-AE"},{name:"ar-AE-HamdanNeural",gender:"male",displayName:"حمدان",locale:"ar-AE"},{name:"ar-YE-MaryamNeural",gender:"female",displayName:"مريم",locale:"ar-YE"},{name:"ar-YE-SalehNeural",gender:"male",displayName:"صالح",locale:"ar-YE"},{name:"az-AZ-BabekNeural",gender:"male",displayName:"Babək",locale:"az-AZ"},{name:"az-AZ-BanuNeural",gender:"female",displayName:"Banu",locale:"az-AZ"},{name:"bn-BD-NabanitaNeural",gender:"female",displayName:"নবনীতা",locale:"bn-BD"},{name:"bn-BD-PradeepNeural",gender:"male",displayName:"প্রদ্বীপ",locale:"bn-BD"},{name:"bn-IN-BashkarNeural",gender:"male",displayName:"ভাস্কর",locale:"bn-IN"},{name:"bn-IN-TanishaaNeural",gender:"female",displayName:"তানিশা",locale:"bn-IN"},{name:"bs-BA-VesnaNeural",gender:"female",displayName:"Vesna",locale:"bs-BA"},{name:"bs-BA-GoranNeural",gender:"male",displayName:"Goran",locale:"bs-BA"},{name:"bg-BG-BorislavNeural",gender:"male",displayName:"Борислав",locale:"bg-BG"},{name:"bg-BG-KalinaNeural",gender:"female",displayName:"Калина",locale:"bg-BG"},{name:"my-MM-NilarNeural",gender:"female",displayName:"နီလာ",locale:"my-MM"},{name:"my-MM-ThihaNeural",gender:"male",displayName:"သီဟ",locale:"my-MM"},{name:"ca-ES-EnricNeural",gender:"male",displayName:"Enric",locale:"ca-ES"},{name:"ca-ES-JoanaNeural",gender:"female",displayName:"Joana",locale:"ca-ES"},{name:"zh-HK-HiuGaaiNeural",gender:"female",displayName:"曉佳",locale:"zh-HK"},{name:"zh-CN-XiaoyiNeural",gender:"female",displayName:"晓伊",locale:"zh-CN"},{name:"zh-CN-YunjianNeural",gender:"male",displayName:"云健",locale:"zh-CN"},{name:"zh-CN-YunxiaNeural",gender:"male",displayName:"云夏",locale:"zh-CN"},{name:"zh-CN-YunyangNeural",gender:"male",displayName:"云扬",locale:"zh-CN"},{name:"zh-CN-liaoning-XiaobeiNeural",gender:"female",displayName:"晓北 辽宁",locale:"zh-CN"},{name:"zh-CN-shaanxi-XiaoniNeural",gender:"female",displayName:"晓妮 陕西",locale:"zh-CN"},{name:"zh-TW-HsiaoYuNeural",gender:"female",displayName:"曉雨",locale:"zh-TW"},{name:"hr-HR-GabrijelaNeural",gender:"female",displayName:"Gabrijela",locale:"hr-HR"},{name:"hr-HR-SreckoNeural",gender:"male",displayName:"Srećko",locale:"hr-HR"},{name:"cs-CZ-AntoninNeural",gender:"male",displayName:"Antonín",locale:"cs-CZ"},{name:"cs-CZ-VlastaNeural",gender:"female",displayName:"Vlasta",locale:"cs-CZ"},{name:"da-DK-ChristelNeural",gender:"female",displayName:"Christel",locale:"da-DK"},{name:"da-DK-JeppeNeural",gender:"male",displayName:"Jeppe",locale:"da-DK"},{name:"nl-BE-ArnaudNeural",gender:"male",displayName:"Arnaud",locale:"nl-BE"},{name:"nl-BE-DenaNeural",gender:"female",displayName:"Dena",locale:"nl-BE"},{name:"nl-NL-ColetteNeural",gender:"female",displayName:"Colette",locale:"nl-NL"},{name:"nl-NL-FennaNeural",gender:"female",displayName:"Fenna",locale:"nl-NL"},{name:"nl-NL-MaartenNeural",gender:"male",displayName:"Maarten",locale:"nl-NL"},{name:"en-AU-WilliamMultilingualNeural",gender:"male",displayName:"William Multilingual",locale:"en-AU"},{name:"en-AU-NatashaNeural",gender:"female",displayName:"Natasha",locale:"en-AU"},{name:"en-CA-ClaraNeural",gender:"female",displayName:"Clara",locale:"en-CA"},{name:"en-CA-LiamNeural",gender:"male",displayName:"Liam",locale:"en-CA"},{name:"en-HK-YanNeural",gender:"female",displayName:"Yan",locale:"en-HK"},{name:"en-HK-SamNeural",gender:"male",displayName:"Sam",locale:"en-HK"},{name:"en-IN-NeerjaNeural",gender:"female",displayName:"Neerja",locale:"en-IN"},{name:"en-IN-PrabhatNeural",gender:"male",displayName:"Prabhat",locale:"en-IN"},{name:"en-IE-ConnorNeural",gender:"male",displayName:"Connor",locale:"en-IE"},{name:"en-IE-EmilyNeural",gender:"female",displayName:"Emily",locale:"en-IE"},{name:"en-KE-AsiliaNeural",gender:"female",displayName:"Asilia",locale:"en-KE"},{name:"en-KE-ChilembaNeural",gender:"male",displayName:"Chilemba",locale:"en-KE"},{name:"en-NZ-MitchellNeural",gender:"male",displayName:"Mitchell",locale:"en-NZ"},{name:"en-NZ-MollyNeural",gender:"female",displayName:"Molly",locale:"en-NZ"},{name:"en-NG-AbeoNeural",gender:"male",displayName:"Abeo",locale:"en-NG"},{name:"en-NG-EzinneNeural",gender:"female",displayName:"Ezinne",locale:"en-NG"},{name:"en-PH-JamesNeural",gender:"male",displayName:"James",locale:"en-PH"},{name:"en-PH-RosaNeural",gender:"female",displayName:"Rosa",locale:"en-PH"},{name:"en-US-AvaNeural",gender:"female",displayName:"Ava",locale:"en-US"},{name:"en-US-AndrewNeural",gender:"male",displayName:"Andrew",locale:"en-US"},{name:"en-US-EmmaNeural",gender:"female",displayName:"Emma",locale:"en-US"},{name:"en-US-BrianNeural",gender:"male",displayName:"Brian",locale:"en-US"},{name:"en-SG-LunaNeural",gender:"female",displayName:"Luna",locale:"en-SG"},{name:"en-SG-WayneNeural",gender:"male",displayName:"Wayne",locale:"en-SG"},{name:"en-ZA-LeahNeural",gender:"female",displayName:"Leah",locale:"en-ZA"},{name:"en-ZA-LukeNeural",gender:"male",displayName:"Luke",locale:"en-ZA"},{name:"en-TZ-ElimuNeural",gender:"male",displayName:"Elimu",locale:"en-TZ"},{name:"en-TZ-ImaniNeural",gender:"female",displayName:"Imani",locale:"en-TZ"},{name:"en-GB-MaisieNeural",gender:"female",displayName:"Maisie",locale:"en-GB"},{name:"en-GB-ThomasNeural",gender:"male",displayName:"Thomas",locale:"en-GB"},{name:"en-US-AnaNeural",gender:"female",displayName:"Ana",locale:"en-US"},{name:"en-US-AndrewMultilingualNeural",gender:"male",displayName:"Andrew Multilingual",locale:"en-US"},{name:"en-US-AvaMultilingualNeural",gender:"female",displayName:"Ava Multilingual",locale:"en-US"},{name:"en-US-BrianMultilingualNeural",gender:"male",displayName:"Brian Multilingual",locale:"en-US"},{name:"en-US-EmmaMultilingualNeural",gender:"female",displayName:"Emma Multilingual",locale:"en-US"},{name:"en-US-RogerNeural",gender:"male",displayName:"Roger",locale:"en-US"},{name:"en-US-SteffanNeural",gender:"male",displayName:"Steffan",locale:"en-US"},{name:"et-EE-AnuNeural",gender:"female",displayName:"Anu",locale:"et-EE"},{name:"et-EE-KertNeural",gender:"male",displayName:"Kert",locale:"et-EE"},{name:"fil-PH-AngeloNeural",gender:"male",displayName:"Angelo",locale:"fil-PH"},{name:"fil-PH-BlessicaNeural",gender:"female",displayName:"Blessica",locale:"fil-PH"},{name:"fi-FI-HarriNeural",gender:"male",displayName:"Harri",locale:"fi-FI"},{name:"fi-FI-NooraNeural",gender:"female",displayName:"Noora",locale:"fi-FI"},{name:"fr-BE-CharlineNeural",gender:"female",displayName:"Charline",locale:"fr-BE"},{name:"fr-BE-GerardNeural",gender:"male",displayName:"Gerard",locale:"fr-BE"},{name:"fr-CA-ThierryNeural",gender:"male",displayName:"Thierry",locale:"fr-CA"},{name:"fr-CA-AntoineNeural",gender:"male",displayName:"Antoine",locale:"fr-CA"},{name:"fr-CA-JeanNeural",gender:"male",displayName:"Jean",locale:"fr-CA"},{name:"fr-CA-SylvieNeural",gender:"female",displayName:"Sylvie",locale:"fr-CA"},{name:"fr-FR-VivienneMultilingualNeural",gender:"female",displayName:"Vivienne Multilingue",locale:"fr-FR"},{name:"fr-FR-RemyMultilingualNeural",gender:"male",displayName:"Rémy Multilingue",locale:"fr-FR"},{name:"fr-FR-EloiseNeural",gender:"female",displayName:"Eloise",locale:"fr-FR"},{name:"fr-CH-ArianeNeural",gender:"female",displayName:"Ariane",locale:"fr-CH"},{name:"fr-CH-FabriceNeural",gender:"male",displayName:"Fabrice",locale:"fr-CH"},{name:"gl-ES-RoiNeural",gender:"male",displayName:"Roi",locale:"gl-ES"},{name:"gl-ES-SabelaNeural",gender:"female",displayName:"Sabela",locale:"gl-ES"},{name:"ka-GE-EkaNeural",gender:"female",displayName:"ეკა",locale:"ka-GE"},{name:"ka-GE-GiorgiNeural",gender:"male",displayName:"გიორგი",locale:"ka-GE"},{name:"de-AT-IngridNeural",gender:"female",displayName:"Ingrid",locale:"de-AT"},{name:"de-AT-JonasNeural",gender:"male",displayName:"Jonas",locale:"de-AT"},{name:"de-DE-SeraphinaMultilingualNeural",gender:"female",displayName:"Seraphine Mehrsprachig",locale:"de-DE"},{name:"de-DE-FlorianMultilingualNeural",gender:"male",displayName:"Florian Mehrsprachig",locale:"de-DE"},{name:"de-DE-KillianNeural",gender:"male",displayName:"Killian",locale:"de-DE"},{name:"de-CH-JanNeural",gender:"male",displayName:"Jan",locale:"de-CH"},{name:"de-CH-LeniNeural",gender:"female",displayName:"Leni",locale:"de-CH"},{name:"el-GR-AthinaNeural",gender:"female",displayName:"Αθηνά",locale:"el-GR"},{name:"el-GR-NestorasNeural",gender:"male",displayName:"Νέστορας",locale:"el-GR"},{name:"gu-IN-DhwaniNeural",gender:"female",displayName:"ધ્વની",locale:"gu-IN"},{name:"gu-IN-NiranjanNeural",gender:"male",displayName:"નિરંજન",locale:"gu-IN"},{name:"he-IL-AvriNeural",gender:"male",displayName:"אברי",locale:"he-IL"},{name:"he-IL-HilaNeural",gender:"female",displayName:"הילה",locale:"he-IL"},{name:"hi-IN-MadhurNeural",gender:"male",displayName:"मधुर",locale:"hi-IN"},{name:"hi-IN-SwaraNeural",gender:"female",displayName:"स्वरा",locale:"hi-IN"},{name:"hu-HU-NoemiNeural",gender:"female",displayName:"Noémi",locale:"hu-HU"},{name:"hu-HU-TamasNeural",gender:"male",displayName:"Tamás",locale:"hu-HU"},{name:"is-IS-GudrunNeural",gender:"female",displayName:"Guðrún",locale:"is-IS"},{name:"is-IS-GunnarNeural",gender:"male",displayName:"Gunnar",locale:"is-IS"},{name:"id-ID-ArdiNeural",gender:"male",displayName:"Ardi",locale:"id-ID"},{name:"id-ID-GadisNeural",gender:"female",displayName:"Gadis",locale:"id-ID"},{name:"iu-Latn-CA-SiqiniqNeural",gender:"female",displayName:"ᓯᕿᓂᖅ",locale:"iu-Latn-CA"},{name:"iu-Latn-CA-TaqqiqNeural",gender:"male",displayName:"ᑕᖅᑭᖅ",locale:"iu-Latn-CA"},{name:"iu-Cans-CA-SiqiniqNeural",gender:"female",displayName:"ᓯᕿᓂᖅ",locale:"iu-Cans-CA"},{name:"iu-Cans-CA-TaqqiqNeural",gender:"male",displayName:"ᑕᖅᑭᖅ",locale:"iu-Cans-CA"},{name:"ga-IE-ColmNeural",gender:"male",displayName:"Colm",locale:"ga-IE"},{name:"ga-IE-OrlaNeural",gender:"female",displayName:"Orla",locale:"ga-IE"},{name:"it-IT-GiuseppeMultilingualNeural",gender:"male",displayName:"Giuseppe Multilingual",locale:"it-IT"},{name:"jv-ID-DimasNeural",gender:"male",displayName:"Dimas",locale:"jv-ID"},{name:"jv-ID-SitiNeural",gender:"female",displayName:"Siti",locale:"jv-ID"},{name:"kn-IN-GaganNeural",gender:"male",displayName:"ಗಗನ್",locale:"kn-IN"},{name:"kn-IN-SapnaNeural",gender:"female",displayName:"ಸಪ್ನಾ",locale:"kn-IN"},{name:"kk-KZ-AigulNeural",gender:"female",displayName:"Айгүл",locale:"kk-KZ"},{name:"kk-KZ-DauletNeural",gender:"male",displayName:"Дәулет",locale:"kk-KZ"},{name:"km-KH-PisethNeural",gender:"male",displayName:"ពិសិដ្ឋ",locale:"km-KH"},{name:"km-KH-SreymomNeural",gender:"female",displayName:"ស្រីមុំ",locale:"km-KH"},{name:"ko-KR-HyunsuMultilingualNeural",gender:"male",displayName:"Hyunsu Multilingual",locale:"ko-KR"},{name:"lo-LA-ChanthavongNeural",gender:"male",displayName:"ຈັນທະວົງ",locale:"lo-LA"},{name:"lo-LA-KeomanyNeural",gender:"female",displayName:"ແກ້ວມະນີ",locale:"lo-LA"},{name:"lv-LV-EveritaNeural",gender:"female",displayName:"Everita",locale:"lv-LV"},{name:"lv-LV-NilsNeural",gender:"male",displayName:"Nils",locale:"lv-LV"},{name:"lt-LT-LeonasNeural",gender:"male",displayName:"Leonas",locale:"lt-LT"},{name:"lt-LT-OnaNeural",gender:"female",displayName:"Ona",locale:"lt-LT"},{name:"mk-MK-AleksandarNeural",gender:"male",displayName:"Александар",locale:"mk-MK"},{name:"mk-MK-MarijaNeural",gender:"female",displayName:"Марија",locale:"mk-MK"},{name:"ms-MY-OsmanNeural",gender:"male",displayName:"Osman",locale:"ms-MY"},{name:"ms-MY-YasminNeural",gender:"female",displayName:"Yasmin",locale:"ms-MY"},{name:"ml-IN-MidhunNeural",gender:"male",displayName:"മിഥുൻ",locale:"ml-IN"},{name:"ml-IN-SobhanaNeural",gender:"female",displayName:"ശോഭന",locale:"ml-IN"},{name:"mt-MT-GraceNeural",gender:"female",displayName:"Grace",locale:"mt-MT"},{name:"mt-MT-JosephNeural",gender:"male",displayName:"Joseph",locale:"mt-MT"},{name:"mr-IN-AarohiNeural",gender:"female",displayName:"आरोही",locale:"mr-IN"},{name:"mr-IN-ManoharNeural",gender:"male",displayName:"मनोहर",locale:"mr-IN"},{name:"mn-MN-BataaNeural",gender:"male",displayName:"Батаа",locale:"mn-MN"},{name:"mn-MN-YesuiNeural",gender:"female",displayName:"Есүй",locale:"mn-MN"},{name:"ne-NP-HemkalaNeural",gender:"female",displayName:"हेमकला",locale:"ne-NP"},{name:"ne-NP-SagarNeural",gender:"male",displayName:"सागर",locale:"ne-NP"},{name:"nb-NO-FinnNeural",gender:"male",displayName:"Finn",locale:"nb-NO"},{name:"nb-NO-PernilleNeural",gender:"female",displayName:"Pernille",locale:"nb-NO"},{name:"ps-AF-GulNawazNeural",gender:"male",displayName:" ګل نواز",locale:"ps-AF"},{name:"ps-AF-LatifaNeural",gender:"female",displayName:"لطيفه",locale:"ps-AF"},{name:"fa-IR-DilaraNeural",gender:"female",displayName:"دلارا",locale:"fa-IR"},{name:"fa-IR-FaridNeural",gender:"male",displayName:"فرید",locale:"fa-IR"},{name:"pl-PL-MarekNeural",gender:"male",displayName:"Marek",locale:"pl-PL"},{name:"pl-PL-ZofiaNeural",gender:"female",displayName:"Zofia",locale:"pl-PL"},{name:"pt-BR-ThalitaMultilingualNeural",gender:"female",displayName:"Thalita multilíngue",locale:"pt-BR"},{name:"ro-RO-AlinaNeural",gender:"female",displayName:"Alina",locale:"ro-RO"},{name:"ro-RO-EmilNeural",gender:"male",displayName:"Emil",locale:"ro-RO"},{name:"sr-RS-NicholasNeural",gender:"male",displayName:"Никола",locale:"sr-RS"},{name:"sr-RS-SophieNeural",gender:"female",displayName:"Софија",locale:"sr-RS"},{name:"si-LK-SameeraNeural",gender:"male",displayName:"සමීර",locale:"si-LK"},{name:"si-LK-ThiliniNeural",gender:"female",displayName:"තිළිණි",locale:"si-LK"},{name:"sk-SK-LukasNeural",gender:"male",displayName:"Lukáš",locale:"sk-SK"},{name:"sk-SK-ViktoriaNeural",gender:"female",displayName:"Viktória",locale:"sk-SK"},{name:"sl-SI-PetraNeural",gender:"female",displayName:"Petra",locale:"sl-SI"},{name:"sl-SI-RokNeural",gender:"male",displayName:"Rok",locale:"sl-SI"},{name:"so-SO-MuuseNeural",gender:"male",displayName:"Muuse",locale:"so-SO"},{name:"so-SO-UbaxNeural",gender:"female",displayName:"Ubax",locale:"so-SO"},{name:"es-AR-ElenaNeural",gender:"female",displayName:"Elena",locale:"es-AR"},{name:"es-AR-TomasNeural",gender:"male",displayName:"Tomas",locale:"es-AR"},{name:"es-BO-MarceloNeural",gender:"male",displayName:"Marcelo",locale:"es-BO"},{name:"es-BO-SofiaNeural",gender:"female",displayName:"Sofia",locale:"es-BO"},{name:"es-CL-CatalinaNeural",gender:"female",displayName:"Catalina",locale:"es-CL"},{name:"es-CL-LorenzoNeural",gender:"male",displayName:"Lorenzo",locale:"es-CL"},{name:"es-CO-GonzaloNeural",gender:"male",displayName:"Gonzalo",locale:"es-CO"},{name:"es-CO-SalomeNeural",gender:"female",displayName:"Salome",locale:"es-CO"},{name:"es-ES-XimenaNeural",gender:"female",displayName:"Ximena",locale:"es-ES"},{name:"es-CR-JuanNeural",gender:"male",displayName:"Juan",locale:"es-CR"},{name:"es-CR-MariaNeural",gender:"female",displayName:"María",locale:"es-CR"},{name:"es-CU-BelkysNeural",gender:"female",displayName:"Belkys",locale:"es-CU"},{name:"es-CU-ManuelNeural",gender:"male",displayName:"Manuel",locale:"es-CU"},{name:"es-DO-EmilioNeural",gender:"male",displayName:"Emilio",locale:"es-DO"},{name:"es-DO-RamonaNeural",gender:"female",displayName:"Ramona",locale:"es-DO"},{name:"es-EC-AndreaNeural",gender:"female",displayName:"Andrea",locale:"es-EC"},{name:"es-EC-LuisNeural",gender:"male",displayName:"Luis",locale:"es-EC"},{name:"es-SV-LorenaNeural",gender:"female",displayName:"Lorena",locale:"es-SV"},{name:"es-SV-RodrigoNeural",gender:"male",displayName:"Rodrigo",locale:"es-SV"},{name:"es-GQ-JavierNeural",gender:"male",displayName:"Javier",locale:"es-GQ"},{name:"es-GQ-TeresaNeural",gender:"female",displayName:"Teresa",locale:"es-GQ"},{name:"es-GT-AndresNeural",gender:"male",displayName:"Andrés",locale:"es-GT"},{name:"es-GT-MartaNeural",gender:"female",displayName:"Marta",locale:"es-GT"},{name:"es-HN-CarlosNeural",gender:"male",displayName:"Carlos",locale:"es-HN"},{name:"es-HN-KarlaNeural",gender:"female",displayName:"Karla",locale:"es-HN"},{name:"es-MX-DaliaNeural",gender:"female",displayName:"Dalia",locale:"es-MX"},{name:"es-MX-JorgeNeural",gender:"male",displayName:"Jorge",locale:"es-MX"},{name:"es-NI-FedericoNeural",gender:"male",displayName:"Federico",locale:"es-NI"},{name:"es-NI-YolandaNeural",gender:"female",displayName:"Yolanda",locale:"es-NI"},{name:"es-PA-MargaritaNeural",gender:"female",displayName:"Margarita",locale:"es-PA"},{name:"es-PA-RobertoNeural",gender:"male",displayName:"Roberto",locale:"es-PA"},{name:"es-PY-MarioNeural",gender:"male",displayName:"Mario",locale:"es-PY"},{name:"es-PY-TaniaNeural",gender:"female",displayName:"Tania",locale:"es-PY"},{name:"es-PE-AlexNeural",gender:"male",displayName:"Alex",locale:"es-PE"},{name:"es-PE-CamilaNeural",gender:"female",displayName:"Camila",locale:"es-PE"},{name:"es-PR-KarinaNeural",gender:"female",displayName:"Karina",locale:"es-PR"},{name:"es-PR-VictorNeural",gender:"male",displayName:"Víctor",locale:"es-PR"},{name:"es-US-AlonsoNeural",gender:"male",displayName:"Alonso",locale:"es-US"},{name:"es-US-PalomaNeural",gender:"female",displayName:"Paloma",locale:"es-US"},{name:"es-UY-MateoNeural",gender:"male",displayName:"Mateo",locale:"es-UY"},{name:"es-UY-ValentinaNeural",gender:"female",displayName:"Valentina",locale:"es-UY"},{name:"es-VE-PaolaNeural",gender:"female",displayName:"Paola",locale:"es-VE"},{name:"es-VE-SebastianNeural",gender:"male",displayName:"Sebastián",locale:"es-VE"},{name:"su-ID-JajangNeural",gender:"male",displayName:"Jajang",locale:"su-ID"},{name:"su-ID-TutiNeural",gender:"female",displayName:"Tuti",locale:"su-ID"},{name:"sw-KE-RafikiNeural",gender:"male",displayName:"Rafiki",locale:"sw-KE"},{name:"sw-KE-ZuriNeural",gender:"female",displayName:"Zuri",locale:"sw-KE"},{name:"sw-TZ-DaudiNeural",gender:"male",displayName:"Daudi",locale:"sw-TZ"},{name:"sw-TZ-RehemaNeural",gender:"female",displayName:"Rehema",locale:"sw-TZ"},{name:"sv-SE-MattiasNeural",gender:"male",displayName:"Mattias",locale:"sv-SE"},{name:"sv-SE-SofieNeural",gender:"female",displayName:"Sofie",locale:"sv-SE"},{name:"ta-IN-PallaviNeural",gender:"female",displayName:"பல்லவி",locale:"ta-IN"},{name:"ta-IN-ValluvarNeural",gender:"male",displayName:"வள்ளுவர்",locale:"ta-IN"},{name:"ta-MY-KaniNeural",gender:"female",displayName:"கனி",locale:"ta-MY"},{name:"ta-MY-SuryaNeural",gender:"male",displayName:"சூர்யா",locale:"ta-MY"},{name:"ta-SG-AnbuNeural",gender:"male",displayName:"அன்பு",locale:"ta-SG"},{name:"ta-SG-VenbaNeural",gender:"female",displayName:"வெண்பா",locale:"ta-SG"},{name:"ta-LK-KumarNeural",gender:"male",displayName:"குமார்",locale:"ta-LK"},{name:"ta-LK-SaranyaNeural",gender:"female",displayName:"சரண்யா",locale:"ta-LK"},{name:"te-IN-MohanNeural",gender:"male",displayName:"మోహన్",locale:"te-IN"},{name:"te-IN-ShrutiNeural",gender:"female",displayName:"శ్రుతి",locale:"te-IN"},{name:"th-TH-NiwatNeural",gender:"male",displayName:"นิวัฒน์",locale:"th-TH"},{name:"th-TH-PremwadeeNeural",gender:"female",displayName:"เปรมวดี",locale:"th-TH"},{name:"tr-TR-EmelNeural",gender:"female",displayName:"Emel",locale:"tr-TR"},{name:"tr-TR-AhmetNeural",gender:"male",displayName:"Ahmet",locale:"tr-TR"},{name:"uk-UA-OstapNeural",gender:"male",displayName:"Остап",locale:"uk-UA"},{name:"uk-UA-PolinaNeural",gender:"female",displayName:"Поліна",locale:"uk-UA"},{name:"ur-IN-GulNeural",gender:"female",displayName:"گل",locale:"ur-IN"},{name:"ur-IN-SalmanNeural",gender:"male",displayName:"سلمان",locale:"ur-IN"},{name:"ur-PK-AsadNeural",gender:"male",displayName:"اسد",locale:"ur-PK"},{name:"ur-PK-UzmaNeural",gender:"female",displayName:"عظمیٰ",locale:"ur-PK"},{name:"uz-UZ-MadinaNeural",gender:"female",displayName:"Madina",locale:"uz-UZ"},{name:"uz-UZ-SardorNeural",gender:"male",displayName:"Sardor",locale:"uz-UZ"},{name:"vi-VN-HoaiMyNeural",gender:"female",displayName:"Hoài My",locale:"vi-VN"},{name:"vi-VN-NamMinhNeural",gender:"male",displayName:"Nam Minh",locale:"vi-VN"},{name:"cy-GB-AledNeural",gender:"male",displayName:"Aled",locale:"cy-GB"},{name:"cy-GB-NiaNeural",gender:"female",displayName:"Nia",locale:"cy-GB"},{name:"zu-ZA-ThandoNeural",gender:"female",displayName:"Thando",locale:"zu-ZA"},{name:"zu-ZA-ThembaNeural",gender:"male",displayName:"Themba",locale:"zu-ZA"},{name:"as-IN-YashicaNeural",gender:"female",displayName:"যাশিকা",locale:"as-IN"},{name:"as-IN-PriyomNeural",gender:"male",displayName:"প্ৰিয়ম",locale:"as-IN"},{name:"ca-ES-AlbaNeural",gender:"female",displayName:"Alba",locale:"ca-ES"},{name:"de-DE-ChristophNeural",gender:"male",displayName:"Christoph",locale:"de-DE"},{name:"de-DE-ElkeNeural",gender:"female",displayName:"Elke",locale:"de-DE"},{name:"de-DE-GiselaNeural",gender:"female",displayName:"Gisela",locale:"de-DE"},{name:"de-DE-KasperNeural",gender:"male",displayName:"Kasper",locale:"de-DE"},{name:"de-DE-KlarissaNeural",gender:"female",displayName:"Klarissa",locale:"de-DE"},{name:"de-DE-KlausNeural",gender:"male",displayName:"Klaus",locale:"de-DE"},{name:"de-DE-LouisaNeural",gender:"female",displayName:"Louisa",locale:"de-DE"},{name:"de-DE-MajaNeural",gender:"female",displayName:"Maja",locale:"de-DE"},{name:"de-DE-RalfNeural",gender:"male",displayName:"Ralf",locale:"de-DE"},{name:"de-DE-TanjaNeural",gender:"female",displayName:"Tanja",locale:"de-DE"},{name:"en-AU-WilliamNeural",gender:"male",displayName:"William",locale:"en-AU"},{name:"en-AU-AnnetteNeural",gender:"female",displayName:"Annette",locale:"en-AU"},{name:"en-AU-CarlyNeural",gender:"female",displayName:"Carly",locale:"en-AU"},{name:"en-AU-DarrenNeural",gender:"male",displayName:"Darren",locale:"en-AU"},{name:"en-AU-DuncanNeural",gender:"male",displayName:"Duncan",locale:"en-AU"},{name:"en-AU-ElsieNeural",gender:"female",displayName:"Elsie",locale:"en-AU"},{name:"en-AU-FreyaNeural",gender:"female",displayName:"Freya",locale:"en-AU"},{name:"en-AU-JoanneNeural",gender:"female",displayName:"Joanne",locale:"en-AU"},{name:"en-AU-KenNeural",gender:"male",displayName:"Ken",locale:"en-AU"},{name:"en-AU-KimNeural",gender:"female",displayName:"Kim",locale:"en-AU"},{name:"en-AU-NeilNeural",gender:"male",displayName:"Neil",locale:"en-AU"},{name:"en-AU-TimNeural",gender:"male",displayName:"Tim",locale:"en-AU"},{name:"en-AU-TinaNeural",gender:"female",displayName:"Tina",locale:"en-AU"},{name:"en-GB-AdaMultilingualNeural",gender:"female",displayName:"Ada Multilingual",locale:"en-GB"},{name:"en-GB-OllieMultilingualNeural",gender:"male",displayName:"Ollie Multilingual",locale:"en-GB"},{name:"en-GB-AbbiNeural",gender:"female",displayName:"Abbi",locale:"en-GB"},{name:"en-GB-AlfieNeural",gender:"male",displayName:"Alfie",locale:"en-GB"},{name:"en-GB-BellaNeural",gender:"female",displayName:"Bella",locale:"en-GB"},{name:"en-GB-ElliotNeural",gender:"male",displayName:"Elliot",locale:"en-GB"},{name:"en-GB-EthanNeural",gender:"male",displayName:"Ethan",locale:"en-GB"},{name:"en-GB-HollieNeural",gender:"female",displayName:"Hollie",locale:"en-GB"},{name:"en-GB-NoahNeural",gender:"male",displayName:"Noah",locale:"en-GB"},{name:"en-GB-OliverNeural",gender:"male",displayName:"Oliver",locale:"en-GB"},{name:"en-GB-OliviaNeural",gender:"female",displayName:"Olivia",locale:"en-GB"},{name:"en-GB-MiaNeural",gender:"female",displayName:"Mia",locale:"en-GB"},{name:"en-IN-AartiIndicNeural",gender:"female",displayName:"Aarti Indic",locale:"en-IN"},{name:"en-IN-ArjunIndicNeural",gender:"male",displayName:"Arjun Indic",locale:"en-IN"},{name:"en-IN-NeerjaIndicNeural",gender:"female",displayName:"Neerja Indic",locale:"en-IN"},{name:"en-IN-PrabhatIndicNeural",gender:"male",displayName:"Prabhat Indic",locale:"en-IN"},{name:"en-IN-AaravNeural",gender:"male",displayName:"Aarav",locale:"en-IN"},{name:"en-IN-AashiNeural",gender:"female",displayName:"Aashi",locale:"en-IN"},{name:"en-IN-AartiNeural",gender:"female",displayName:"Aarti",locale:"en-IN"},{name:"en-IN-ArjunNeural",gender:"male",displayName:"Arjun",locale:"en-IN"},{name:"en-IN-AnanyaNeural",gender:"female",displayName:"Ananya",locale:"en-IN"},{name:"en-IN-KavyaNeural",gender:"female",displayName:"Kavya",locale:"en-IN"},{name:"en-IN-KunalNeural",gender:"male",displayName:"Kunal",locale:"en-IN"},{name:"en-IN-RehaanNeural",gender:"male",displayName:"Rehaan",locale:"en-IN"},{name:"en-US-AmandaMultilingualNeural",gender:"female",displayName:"Amanda Multilingual",locale:"en-US"},{name:"en-US-AdamMultilingualNeural",gender:"male",displayName:"Adam Multilingual",locale:"en-US"},{name:"en-US-PhoebeMultilingualNeural",gender:"female",displayName:"Phoebe Multilingual",locale:"en-US"},{name:"en-US-AlloyTurboMultilingualNeural",gender:"male",displayName:"Alloy Turbo Multilingual",locale:"en-US"},{name:"en-US-EchoTurboMultilingualNeural",gender:"male",displayName:"Echo Turbo Multilingual",locale:"en-US"},{name:"en-US-FableTurboMultilingualNeural",gender:"female",displayName:"Fable Turbo Multilingual",locale:"en-US"},{name:"en-US-OnyxTurboMultilingualNeural",gender:"male",displayName:"Onyx Turbo Multilingual",locale:"en-US"},{name:"en-US-NovaTurboMultilingualNeural",gender:"female",displayName:"Nova Turbo Multilingual",locale:"en-US"},{name:"en-US-ShimmerTurboMultilingualNeural",gender:"female",displayName:"Shimmer Turbo Multilingual",locale:"en-US"},{name:"en-US-JasonNeural",gender:"male",displayName:"Jason",locale:"en-US"},{name:"en-US-KaiNeural",gender:"male",displayName:"Kai",locale:"en-US"},{name:"en-US-LunaNeural",gender:"female",displayName:"Luna",locale:"en-US"},{name:"en-US-TonyNeural",gender:"male",displayName:"Tony",locale:"en-US"},{name:"en-US-NancyNeural",gender:"female",displayName:"Nancy",locale:"en-US"},{name:"en-US-CoraMultilingualNeural",gender:"female",displayName:"Cora Multilingual",locale:"en-US"},{name:"en-US-ChristopherMultilingualNeural",gender:"male",displayName:"Christopher Multilingual",locale:"en-US"},{name:"en-US-BrandonMultilingualNeural",gender:"male",displayName:"Brandon Multilingual",locale:"en-US"},{name:"en-US-AshleyNeural",gender:"female",displayName:"Ashley",locale:"en-US"},{name:"en-US-BrandonNeural",gender:"male",displayName:"Brandon",locale:"en-US"},{name:"en-US-CoraNeural",gender:"female",displayName:"Cora",locale:"en-US"},{name:"en-US-DavisMultilingualNeural",gender:"male",displayName:"Davis Multilingual",locale:"en-US"},{name:"en-US-DerekMultilingualNeural",gender:"male",displayName:"Derek Multilingual",locale:"en-US"},{name:"en-US-DustinMultilingualNeural",gender:"male",displayName:"Dustin Multilingual",locale:"en-US"},{name:"en-US-ElizabethNeural",gender:"female",displayName:"Elizabeth",locale:"en-US"},{name:"en-US-JacobNeural",gender:"male",displayName:"Jacob",locale:"en-US"},{name:"en-US-JennyMultilingualNeural",gender:"female",displayName:"Jenny Multilingual",locale:"en-US"},{name:"en-US-LewisMultilingualNeural",gender:"male",displayName:"Lewis Multilingual",locale:"en-US"},{name:"en-US-LolaMultilingualNeural",gender:"female",displayName:"Lola Multilingual",locale:"en-US"},{name:"en-US-MonicaNeural",gender:"female",displayName:"Monica",locale:"en-US"},{name:"en-US-NancyMultilingualNeural",gender:"female",displayName:"Nancy Multilingual",locale:"en-US"},{name:"en-US-RyanMultilingualNeural",gender:"male",displayName:"Ryan Multilingual",locale:"en-US"},{name:"en-US-SamuelMultilingualNeural",gender:"male",displayName:"Samuel Multilingual",locale:"en-US"},{name:"en-US-SerenaMultilingualNeural",gender:"female",displayName:"Serena Multilingual",locale:"en-US"},{name:"en-US-SteffanMultilingualNeural",gender:"male",displayName:"Steffan Multilingual",locale:"en-US"},{name:"en-US-AIGenerate1Neural",gender:"male",displayName:"AIGenerate1",locale:"en-US"},{name:"en-US-AIGenerate2Neural",gender:"female",displayName:"AIGenerate2",locale:"en-US"},{name:"en-US-AshTurboMultilingualNeural",gender:"male",displayName:"Ash Turbo Multilingual",locale:"en-US"},{name:"en-US-BlueNeural",gender:"female",displayName:"Blue",locale:"en-US"},{name:"en-US-EvelynMultilingualNeural",gender:"female",displayName:"Evelyn Multilingual",locale:"en-US"},{name:"es-ES-ArabellaMultilingualNeural",gender:"female",displayName:"Arabella Multilingual",locale:"es-ES"},{name:"es-ES-IsidoraMultilingualNeural",gender:"female",displayName:"Isidora Multilingual",locale:"es-ES"},{name:"es-ES-TristanMultilingualNeural",gender:"male",displayName:"Tristan Multilingual",locale:"es-ES"},{name:"es-ES-XimenaMultilingualNeural",gender:"female",displayName:"Ximena Multilingual",locale:"es-ES"},{name:"es-ES-DarioNeural",gender:"male",displayName:"Dario",locale:"es-ES"},{name:"es-ES-EliasNeural",gender:"male",displayName:"Elias",locale:"es-ES"},{name:"es-ES-EstrellaNeural",gender:"female",displayName:"Estrella",locale:"es-ES"},{name:"es-ES-IreneNeural",gender:"female",displayName:"Irene",locale:"es-ES"},{name:"es-ES-LaiaNeural",gender:"female",displayName:"Laia",locale:"es-ES"},{name:"es-ES-LiaNeural",gender:"female",displayName:"Lia",locale:"es-ES"},{name:"es-ES-NilNeural",gender:"male",displayName:"Nil",locale:"es-ES"},{name:"es-ES-SaulNeural",gender:"male",displayName:"Saul",locale:"es-ES"},{name:"es-ES-TeoNeural",gender:"male",displayName:"Teo",locale:"es-ES"},{name:"es-ES-TrianaNeural",gender:"female",displayName:"Triana",locale:"es-ES"},{name:"es-ES-VeraNeural",gender:"female",displayName:"Vera",locale:"es-ES"},{name:"es-MX-DaliaMultilingualNeural",gender:"female",displayName:"Dalia Multilingual",locale:"es-MX"},{name:"es-MX-JorgeMultilingualNeural",gender:"male",displayName:"Jorge Multilingual",locale:"es-MX"},{name:"es-MX-BeatrizNeural",gender:"female",displayName:"Beatriz",locale:"es-MX"},{name:"es-MX-CandelaNeural",gender:"female",displayName:"Candela",locale:"es-MX"},{name:"es-MX-CarlotaNeural",gender:"female",displayName:"Carlota",locale:"es-MX"},{name:"es-MX-CecilioNeural",gender:"male",displayName:"Cecilio",locale:"es-MX"},{name:"es-MX-GerardoNeural",gender:"male",displayName:"Gerardo",locale:"es-MX"},{name:"es-MX-LarissaNeural",gender:"female",displayName:"Larissa",locale:"es-MX"},{name:"es-MX-LibertoNeural",gender:"male",displayName:"Liberto",locale:"es-MX"},{name:"es-MX-LucianoNeural",gender:"male",displayName:"Luciano",locale:"es-MX"},{name:"es-MX-MarinaNeural",gender:"female",displayName:"Marina",locale:"es-MX"},{name:"es-MX-NuriaNeural",gender:"female",displayName:"Nuria",locale:"es-MX"},{name:"es-MX-PelayoNeural",gender:"male",displayName:"Pelayo",locale:"es-MX"},{name:"es-MX-RenataNeural",gender:"female",displayName:"Renata",locale:"es-MX"},{name:"es-MX-YagoNeural",gender:"male",displayName:"Yago",locale:"es-MX"},{name:"eu-ES-AinhoaNeural",gender:"female",displayName:"Ainhoa",locale:"eu-ES"},{name:"eu-ES-AnderNeural",gender:"male",displayName:"Ander",locale:"eu-ES"},{name:"fi-FI-SelmaNeural",gender:"female",displayName:"Selma",locale:"fi-FI"},{name:"fr-FR-LucienMultilingualNeural",gender:"male",displayName:"Lucien Multilingual",locale:"fr-FR"},{name:"fr-FR-AlainNeural",gender:"male",displayName:"Alain",locale:"fr-FR"},{name:"fr-FR-BrigitteNeural",gender:"female",displayName:"Brigitte",locale:"fr-FR"},{name:"fr-FR-CelesteNeural",gender:"female",displayName:"Celeste",locale:"fr-FR"},{name:"fr-FR-ClaudeNeural",gender:"male",displayName:"Claude",locale:"fr-FR"},{name:"fr-FR-CoralieNeural",gender:"female",displayName:"Coralie",locale:"fr-FR"},{name:"fr-FR-JacquelineNeural",gender:"female",displayName:"Jacqueline",locale:"fr-FR"},{name:"fr-FR-JeromeNeural",gender:"male",displayName:"Jerome",locale:"fr-FR"},{name:"fr-FR-JosephineNeural",gender:"female",displayName:"Josephine",locale:"fr-FR"},{name:"fr-FR-MauriceNeural",gender:"male",displayName:"Maurice",locale:"fr-FR"},{name:"fr-FR-YvesNeural",gender:"male",displayName:"Yves",locale:"fr-FR"},{name:"fr-FR-YvetteNeural",gender:"female",displayName:"Yvette",locale:"fr-FR"},{name:"hi-IN-AaravNeural",gender:"male",displayName:"आरव ",locale:"hi-IN"},{name:"hi-IN-AnanyaNeural",gender:"female",displayName:"अनन्या",locale:"hi-IN"},{name:"hi-IN-AartiNeural",gender:"female",displayName:"आरती",locale:"hi-IN"},{name:"hi-IN-ArjunNeural",gender:"male",displayName:"अर्जुन",locale:"hi-IN"},{name:"hi-IN-KavyaNeural",gender:"female",displayName:"काव्या",locale:"hi-IN"},{name:"hi-IN-KunalNeural",gender:"male",displayName:"कुनाल ",locale:"hi-IN"},{name:"hi-IN-RehaanNeural",gender:"male",displayName:"रेहान",locale:"hi-IN"},{name:"hy-AM-AnahitNeural",gender:"female",displayName:"Անահիտ",locale:"hy-AM"},{name:"hy-AM-HaykNeural",gender:"male",displayName:"Հայկ",locale:"hy-AM"},{name:"it-IT-AlessioMultilingualNeural",gender:"male",displayName:"Alessio Multilingual",locale:"it-IT"},{name:"it-IT-IsabellaMultilingualNeural",gender:"female",displayName:"Isabella Multilingual",locale:"it-IT"},{name:"it-IT-MarcelloMultilingualNeural",gender:"male",displayName:"Marcello Multilingual",locale:"it-IT"},{name:"it-IT-CalimeroNeural",gender:"male",displayName:"Calimero",locale:"it-IT"},{name:"it-IT-CataldoNeural",gender:"male",displayName:"Cataldo",locale:"it-IT"},{name:"it-IT-FabiolaNeural",gender:"female",displayName:"Fabiola",locale:"it-IT"},{name:"it-IT-FiammaNeural",gender:"female",displayName:"Fiamma",locale:"it-IT"},{name:"it-IT-GianniNeural",gender:"male",displayName:"Gianni",locale:"it-IT"},{name:"it-IT-GiuseppeNeural",gender:"male",displayName:"Giuseppe",locale:"it-IT"},{name:"it-IT-ImeldaNeural",gender:"female",displayName:"Imelda",locale:"it-IT"},{name:"it-IT-IrmaNeural",gender:"female",displayName:"Irma",locale:"it-IT"},{name:"it-IT-LisandroNeural",gender:"male",displayName:"Lisandro",locale:"it-IT"},{name:"it-IT-PalmiraNeural",gender:"female",displayName:"Palmira",locale:"it-IT"},{name:"it-IT-PierinaNeural",gender:"female",displayName:"Pierina",locale:"it-IT"},{name:"it-IT-RinaldoNeural",gender:"male",displayName:"Rinaldo",locale:"it-IT"},{name:"ja-JP-AoiNeural",gender:"female",displayName:"碧衣",locale:"ja-JP"},{name:"ja-JP-DaichiNeural",gender:"male",displayName:"大智",locale:"ja-JP"},{name:"ja-JP-MayuNeural",gender:"female",displayName:"真夕",locale:"ja-JP"},{name:"ja-JP-NaokiNeural",gender:"male",displayName:"直紀",locale:"ja-JP"},{name:"ja-JP-ShioriNeural",gender:"female",displayName:"志織",locale:"ja-JP"},{name:"ja-JP-MasaruMultilingualNeural",gender:"male",displayName:"勝 多言語",locale:"ja-JP"},{name:"ko-KR-BongJinNeural",gender:"male",displayName:"봉진",locale:"ko-KR"},{name:"ko-KR-GookMinNeural",gender:"male",displayName:"국민",locale:"ko-KR"},{name:"ko-KR-HyunsuNeural",gender:"male",displayName:"현수",locale:"ko-KR"},{name:"ko-KR-JiMinNeural",gender:"female",displayName:"지민",locale:"ko-KR"},{name:"ko-KR-SeoHyeonNeural",gender:"female",displayName:"서현",locale:"ko-KR"},{name:"ko-KR-YuJinNeural",gender:"female",displayName:"유진",locale:"ko-KR"},{name:"nb-NO-IselinNeural",gender:"female",displayName:"Iselin",locale:"nb-NO"},{name:"or-IN-SubhasiniNeural",gender:"female",displayName:"ସୁଭାସିନୀ",locale:"or-IN"},{name:"or-IN-SukantNeural",gender:"male",displayName:"ସୁକାନ୍ତ",locale:"or-IN"},{name:"pa-IN-OjasNeural",gender:"male",displayName:"ਓਜਸ",locale:"pa-IN"},{name:"pa-IN-VaaniNeural",gender:"female",displayName:"ਵਾਨੀ",locale:"pa-IN"},{name:"pl-PL-AgnieszkaNeural",gender:"female",displayName:"Agnieszka",locale:"pl-PL"},{name:"pt-BR-MacerioMultilingualNeural",gender:"male",displayName:"Macerio Multilingual",locale:"pt-BR"},{name:"pt-BR-BrendaNeural",gender:"female",displayName:"Brenda",locale:"pt-BR"},{name:"pt-BR-DonatoNeural",gender:"male",displayName:"Donato",locale:"pt-BR"},{name:"pt-BR-ElzaNeural",gender:"female",displayName:"Elza",locale:"pt-BR"},{name:"pt-BR-FabioNeural",gender:"male",displayName:"Fabio",locale:"pt-BR"},{name:"pt-BR-GiovannaNeural",gender:"female",displayName:"Giovanna",locale:"pt-BR"},{name:"pt-BR-HumbertoNeural",gender:"male",displayName:"Humberto",locale:"pt-BR"},{name:"pt-BR-JulioNeural",gender:"male",displayName:"Julio",locale:"pt-BR"},{name:"pt-BR-LeilaNeural",gender:"female",displayName:"Leila",locale:"pt-BR"},{name:"pt-BR-LeticiaNeural",gender:"female",displayName:"Leticia",locale:"pt-BR"},{name:"pt-BR-ManuelaNeural",gender:"female",displayName:"Manuela",locale:"pt-BR"},{name:"pt-BR-NicolauNeural",gender:"male",displayName:"Nicolau",locale:"pt-BR"},{name:"pt-BR-ThalitaNeural",gender:"female",displayName:"Thalita",locale:"pt-BR"},{name:"pt-BR-ValerioNeural",gender:"male",displayName:"Valerio",locale:"pt-BR"},{name:"pt-BR-YaraNeural",gender:"female",displayName:"Yara",locale:"pt-BR"},{name:"pt-PT-FernandaNeural",gender:"female",displayName:"Fernanda",locale:"pt-PT"},{name:"sr-Latn-RS-NicholasNeural",gender:"male",displayName:"Nicholas",locale:"sr-Latn-RS"},{name:"sr-Latn-RS-SophieNeural",gender:"female",displayName:"Sophie",locale:"sr-Latn-RS"},{name:"sv-SE-HilleviNeural",gender:"female",displayName:"Hillevi",locale:"sv-SE"},{name:"th-TH-AcharaNeural",gender:"female",displayName:"อัจฉรา",locale:"th-TH"},{name:"wuu-CN-XiaotongNeural",gender:"female",displayName:"晓彤",locale:"wuu-CN"},{name:"wuu-CN-YunzheNeural",gender:"male",displayName:"云哲",locale:"wuu-CN"},{name:"zh-CN-XiaochenNeural",gender:"female",displayName:"晓辰",locale:"zh-CN"},{name:"zh-CN-XiaochenMultilingualNeural",gender:"female",displayName:"晓辰 多语言",locale:"zh-CN"},{name:"zh-CN-XiaohanNeural",gender:"female",displayName:"晓涵",locale:"zh-CN"},{name:"zh-CN-XiaomengNeural",gender:"female",displayName:"晓梦",locale:"zh-CN"},{name:"zh-CN-XiaomoNeural",gender:"female",displayName:"晓墨",locale:"zh-CN"},{name:"zh-CN-XiaoqiuNeural",gender:"female",displayName:"晓秋",locale:"zh-CN"},{name:"zh-CN-XiaorouNeural",gender:"female",displayName:"晓柔",locale:"zh-CN"},{name:"zh-CN-XiaoruiNeural",gender:"female",displayName:"晓睿",locale:"zh-CN"},{name:"zh-CN-XiaoshuangNeural",gender:"female",displayName:"晓双",locale:"zh-CN"},{name:"zh-CN-XiaoxiaoDialectsNeural",gender:"female",displayName:"晓晓 ",locale:"zh-CN"},{name:"zh-CN-XiaoxiaoMultilingualNeural",gender:"female",displayName:"晓晓 多语言",locale:"zh-CN"},{name:"zh-CN-XiaoyanNeural",gender:"female",displayName:"晓颜",locale:"zh-CN"},{name:"zh-CN-XiaoyouNeural",gender:"female",displayName:"晓悠",locale:"zh-CN"},{name:"zh-CN-XiaoyuMultilingualNeural",gender:"female",displayName:"晓宇 多语言",locale:"zh-CN"},{name:"zh-CN-XiaozhenNeural",gender:"female",displayName:"晓甄",locale:"zh-CN"},{name:"zh-CN-YunfengNeural",gender:"male",displayName:"云枫",locale:"zh-CN"},{name:"zh-CN-YunhaoNeural",gender:"male",displayName:"云皓",locale:"zh-CN"},{name:"zh-CN-YunjieNeural",gender:"male",displayName:"云杰",locale:"zh-CN"},{name:"zh-CN-YunxiaoMultilingualNeural",gender:"male",displayName:"云霄 多语言",locale:"zh-CN"},{name:"zh-CN-YunyeNeural",gender:"male",displayName:"云野",locale:"zh-CN"},{name:"zh-CN-YunyiMultilingualNeural",gender:"male",displayName:"云逸 多语言",locale:"zh-CN"},{name:"zh-CN-YunzeNeural",gender:"male",displayName:"云泽",locale:"zh-CN"},{name:"zh-CN-YunfanMultilingualNeural",gender:"male",displayName:"云帆 多语言",locale:"zh-CN"},{name:"zh-CN-guangxi-YunqiNeural",gender:"male",displayName:"云奇 广西",locale:"zh-CN"},{name:"zh-CN-henan-YundengNeural",gender:"male",displayName:"云登 河南",locale:"zh-CN"},{name:"zh-CN-liaoning-YunbiaoNeural",gender:"male",displayName:"云彪 辽宁",locale:"zh-CN"},{name:"zh-CN-shandong-YunxiangNeural",gender:"male",displayName:"云翔 山东",locale:"zh-CN"},{name:"zh-CN-sichuan-YunxiNeural",gender:"male",displayName:"云希 四川",locale:"zh-CN"}],SelfHostedVoiceList:["de-DE-AmalaNeural","de-DE-BerndNeural","de-DE-ConradNeural","de-DE-KatjaNeural","en-GB-LibbyNeural","en-GB-RyanNeural","en-GB-SoniaNeural","en-US-AmberNeural","en-US-AriaNeural","en-US-ChristopherNeural","en-US-DavisNeural","en-US-EricNeural","en-US-GuyNeural","en-US-JaneNeural","en-US-JennyNeural","en-US-MichelleNeural","en-US-SaraNeural","es-ES-AbrilNeural","es-ES-AlvaroNeural","es-ES-ArnauNeural","es-ES-ElviraNeural","fr-FR-DeniseNeural","fr-FR-HenriNeural","it-IT-BenignoNeural","it-IT-DiegoNeural","it-IT-ElsaNeural","it-IT-IsabellaNeural","ja-JP-KeitaNeural","ja-JP-NanamiNeural","ko-KR-InJoonNeural","ko-KR-SoonBokNeural","ko-KR-SunHiNeural","pt-BR-AntonioNeural","pt-BR-FranciscaNeural","pt-PT-DuarteNeural","pt-PT-RaquelNeural","ru-RU-DariyaNeural","ru-RU-DmitryNeural","ru-RU-SvetlanaNeural","yue-CN-XiaoMinNeural","yue-CN-YunSongNeural","zh-CN-henan-YundengNeural","zh-CN-liaoning-XiaobeiNeural","zh-CN-shaanxi-XiaoniNeural","zh-CN-shandong-YunxiangNeural","zh-CN-sichuan-YunxiNeural","zh-CN-XiaoxiaoNeural","zh-CN-YunxiNeural","zh-HK-HiuMaanNeural","zh-HK-WanLungNeural","zh-TW-HsiaoChenNeural","zh-TW-YunJheNeural","zf_xiaoxiao","zm_yunxi","zf_xiaoni","zf_xiaobei"],CloudDictList:[{id:"basic-english-irish",name:"Basic English-Irish Dictionary",translation:"简明英爱词典",source:"Pat Griffin"},{id:"english-italian",name:"English-Italian Dictionary",translation:"简明英意词典",source:"Pat Griffin"},{id:"cc-cedict",name:"CC-CEDICT",translation:"简明中英词典",source:"www.mdbg.net"},{id:"et-tedict",name:"ET-TEDICT",translation:"简明中英英中词典",source:"cdict-1.0-1.i386.rpm"},{id:"jmdict",name:"Japanese English Dictionary",translation:"简明日英词典",source:"JMDict"},{id:"moby",name:"Moby Thesaurus",translation:"Moby Thesaurus",source:"Chua Welic"},{id:"wordnet",name:"Wordnet",translation:"Wordnet",source:"Chua Welic"},{id:"opted",name:"Online Plain Text English Dictionary",translation:"简明英英词典",source:"Chua Welic"},{id:"english-arabic",name:"English-Arabic Dictionary",translation:"简明英阿词典",source:"Khaldoun Mahmoud"},{id:"tcm_textbook",name:"中医教材仓库",translation:"中医教材仓库",source:"Fredrik Jornebo"},{id:"ecdict",name:"ECDICT",translation:"简明英汉字典增强版",source:"GitHub-skywind3000"}]};class x{constructor(e){this.config=e,this.driveId="",this.taskQueue=new k(1),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getDriveId(){return m(this,void 0,void 0,(function*(){if(this.driveId)return this.driveId;const a=this.config.access_token,t=yield e.post("https://openapi.alipan.com/adrive/v1.0/user/getDriveInfo",{},{headers:{Authorization:`Bearer ${a}`}});return this.driveId=t.data.default_drive_id,this.driveId}))}getFolderIdByPath(a){return m(this,void 0,void 0,(function*(){const t=this.config.access_token,o=yield this.getDriveId();try{try{const i=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(i.data)return i.data.file_id}catch(i){const n=a.split("/").filter((e=>e));let r="",l="root";for(const a of n){r+="/"+a;try{l=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:r},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id}catch(i){l=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:o,parent_file_id:l,name:a,type:"folder",check_name_mode:"refuse"},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id}}return l}}catch(e){return console.error("Error getting/creating folder by path:",e),""}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=yield this.getDriveId(),i=yield this.getFolderIdByPath(this.baseFolder+"/"+a);let n=[],r="",l=!0;for(;l;){const a=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/list",{drive_id:o,parent_file_id:i,marker:r||void 0},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}),s=a.data.items.filter((e=>!e.punish_flag||2!==e.punish_flag))||[];n=n.concat(s),r=a.data.next_marker,l=!!r}return[...new Set(n.map((e=>({name:e.name,size:e.size,type:e.type,modified:e.updated_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=yield this.getDriveId(),i=yield this.getFolderIdByPath(this.baseFolder+"/"+a);return!i||(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/delete",{drive_id:o,file_id:i},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}checkExists(a){var t;return m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=yield this.getDriveId(),n=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:i,file_path:a},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}});(null===(t=n.data)||void 0===t?void 0:t.file_id)&&(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/recyclebin/trash",{drive_id:i,file_id:n.data.file_id},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}))}catch(e){}}))}getAuthUrl(e){return`https://openapi.alipan.com/oauth/authorize?${new URLSearchParams({response_type:"code",client_id:C.adriveClientId,redirect_uri:e,grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}).toString()}`}}class I extends x{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=yield this.getDriveId(),n=t.substring(0,t.lastIndexOf("/")),r=t.substring(t.lastIndexOf("/")+1);yield this.deleteFileWithoutQueue(t);const l=yield this.getFolderIdByPath(this.baseFolder+"/"+n),s=yield a.arrayBuffer(),d=s.byteLength,c=yield crypto.subtle.digest("SHA-1",s),u=Array.from(new Uint8Array(c)).map((e=>e.toString(16).padStart(2,"0"))).join(""),m=(e=>{function a(e,a){const t=(65535&e)+(65535&a);return(e>>16)+(a>>16)+(t>>16)<<16|65535&t}function t(e,t,o,i,n,r){return a((l=a(a(t,e),a(i,r)))<<(s=n)|l>>>32-s,o);var l,s}function o(e,a,o,i,n,r,l){return t(a&o|~a&i,e,a,n,r,l)}function i(e,a,o,i,n,r,l){return t(a&i|o&~i,e,a,n,r,l)}function n(e,a,o,i,n,r,l){return t(a^o^i,e,a,n,r,l)}function r(e,a,o,i,n,r,l){return t(o^(a|~i),e,a,n,r,l)}const l=function(e){const a=e.length,t=1+(a+8>>6),o=new Array(16*t).fill(0);for(let t=0;t>2]|=e.charCodeAt(t)<>2]|=128<{let a="";for(let t=0;t<4;t++)a+=("0"+(e>>8*t&255).toString(16)).slice(-2);return a})).join("")})(o),p=Number(BigInt("0x"+m.slice(0,16))%BigInt(d||1)),h=new Uint8Array(s.slice(p,Math.min(p+8,d))),g=btoa(String.fromCharCode(...h)),f=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:i,parent_file_id:l,name:r,type:"file",check_name_mode:"ignore",size:d,content_hash:u,content_hash_name:"sha1",proof_code:g,proof_version:"v1",part_info_list:[{part_number:1}]},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}),{file_id:y,upload_id:N,rapid_upload:v,part_info_list:b}=f.data;return v?(console.info("阿里云盘秒传成功"),!0):(yield fetch(b[0].upload_url,{method:"PUT",body:s,headers:{"Content-Length":d.toString()}}),yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/complete",{drive_id:i,file_id:y,upload_id:N},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=yield this.getDriveId(),i=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:this.baseFolder+"/"+a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id,n=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/getDownloadUrl",{drive_id:o,file_id:i},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return(yield e.get(n.data.url,{responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}})).data}catch(e){return console.error("Error downloading file:",e),!1}}))))))}}class F{constructor(e){this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getFolderIdByPath(a){return m(this,void 0,void 0,(function*(){if(""==a)return"0";const t=this.config.access_token,o=a.split("/");let i="0";for(const a of o){const o=`https://api.box.com/2.0/folders/${i}/items?fields=id,name&type=folder&limit=1000`;try{const n=(yield e.get(o,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===a&&"folder"===e.type));if(n)i=n.id;else{const o={name:a,parent:{id:i},type:"folder"};i=(yield e.post("https://api.box.com/2.0/folders",o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.id}}catch(e){return console.error("Error occurred during folder creation:",e),""}}return i}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);let i=yield this.getFolderIdByPath(o),n=[],r=0,l=!0;const s=1e3;for(;l;){const a=yield e.get(`https://api.box.com/2.0/folders/${i}/items`,{params:{limit:s,offset:r},headers:{Authorization:`Bearer ${t}`}}),o=a.data.entries||[];n=n.concat(o),r+=o.length,l=o.length===s&&a.data.total_count>r}return[...new Set(n.map((e=>({name:e.name,size:e.size||0,type:e.type,modified:e.content_modified_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=a.substring(0,a.lastIndexOf("/")),i=a.substring(a.lastIndexOf("/")+1);let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const r=yield this.getFolderIdByPath(n);if(!r)return!0;const l=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=file&limit=1000`,s=(yield e.get(l,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===i&&"file"===e.type));return!s||(yield e.delete(`https://api.box.com/2.0/files/${s.id}`,{headers:{Authorization:`Bearer ${t}`}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://account.box.com/api/oauth2/authorize?${new URLSearchParams({response_type:"code",client_id:C.boxClientId,redirect_uri:e,grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}).toString()}`}}class R extends F{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=t.substring(0,t.lastIndexOf("/")),n=t.substring(t.lastIndexOf("/")+1);let r=this.baseFolder+"/"+i;for(;r.startsWith("/");)r=r.substring(1);const l=yield this.getFolderIdByPath(r);if(!l)throw new Error("Folder not found");const s=(yield this.listFiles(i)).find((e=>e===n));s&&(yield this.deleteFileWithoutQueue(i+"/"+n));let d=new File([a],n,{lastModified:(new Date).getTime(),type:a.type});const c=new FormData;c.append("file",d),c.append("parent_id",l);const u=yield e.post("https://upload.box.com/api/2.0/files/content",c,{headers:{Authorization:`Bearer ${o}`,"Content-Type":"multipart/form-data"},params:{if_match:"false",fields:"name,id"},maxContentLength:1/0,maxBodyLength:1/0});return!(u.status>=300)||(console.error("Error occurred during file upload:",u),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=a.substring(0,a.lastIndexOf("/")),i=a.substring(a.lastIndexOf("/")+1);let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const r=yield this.getFolderIdByPath(n);if(!r)return console.error("Folder not found"),!0;const l=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=file&limit=1000`,s=(yield e.get(l,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===i&&"file"===e.type));if(!s)return console.error("File not found:",i),!0;const d=yield e({url:`https://api.box.com/2.0/files/${s.id}/content`,method:"get",headers:{Authorization:`Bearer ${t}`},responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return d.status>=300?(console.error("Error occurred during file download:",d),!1):d.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class O{constructor(e){this.config=e,this.taskQueue=new k(3)}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=[],i=!0,n=null;for(;i;){let r;r=n?yield e.post("https://api.dropboxapi.com/2/files/list_folder/continue",{cursor:n},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}):yield e.post("https://api.dropboxapi.com/2/files/list_folder",{path:"/"+a,limit:2e3},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});const l=r.data.entries||[];o=o.concat(l),i=r.data.has_more,n=r.data.cursor}return[...new Set(o.map((e=>({name:e.name,size:e.size||0,type:e[".tag"],modified:e.client_modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;yield e.post("https://api.dropboxapi.com/2/files/delete_v2",{path:"/"+a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://www.dropbox.com/oauth2/authorize?response_type=code&token_access_type=offline&client_id=${C.dropboxClientId}&redirect_uri=${e}`}}class _ extends O{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type});const r=yield e.post("https://content.dropboxapi.com/2/files/upload",n,{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/octet-stream","Dropbox-API-Arg":JSON.stringify({path:"/"+t,mode:"overwrite",autorename:!0,mute:!1})},maxContentLength:1/0,maxBodyLength:1/0});return!(r.status>=300)||(console.error("Error occurred during file upload:",r),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=yield e({url:"https://content.dropboxapi.com/2/files/download",method:"post",headers:{Authorization:`Bearer ${t}`,"Dropbox-API-Arg":JSON.stringify({path:"/"+a})},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return o.status>=300?(console.error("Error occurred during file download:",o),!1):o.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ${constructor(e){this.folderExistsCache=new Set,this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){var t,o;return m(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);let n=[],r=0;const l=1e3;let s=!0;for(;s;){const d=yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:a?`/${a}`:"/",limit:l,offset:r,fields:"_embedded.items.name,_embedded.items.size,_embedded.items.type,_embedded.items.modified,_embedded.total"}}),c=(null===(t=d.data._embedded)||void 0===t?void 0:t.items)||[];n=n.concat(c);const u=(null===(o=d.data._embedded)||void 0===o?void 0:o.total)||0;r+=c.length,s=r({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);const o=yield e.delete("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${t}`,"Content-Type":"application/json"},params:{path:a?`/${a}`:"/",permanently:!1}});return 202===o.status||204===o.status}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(a){var t,o;return m(this,void 0,void 0,(function*(){try{const i=this.config.access_token,n=a.split("/").filter((e=>e.length>0));let r="";for(const a of n)if(r+="/"+a,!this.folderExistsCache.has(r))try{yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:r}}),this.folderExistsCache.add(r)}catch(a){if(404!==(null===(t=a.response)||void 0===t?void 0:t.status))return console.error("Error checking directory:",a),!1;try{yield e.put(`https://cloud-api.yandex.net/v1/disk/resources?path=${encodeURIComponent(r)}`,null,{headers:{Authorization:`OAuth ${i}`}}),this.folderExistsCache.add(r)}catch(e){if(409!==(null===(o=e.response)||void 0===o?void 0:o.status))return console.error("Error creating directory:",e),!1;this.folderExistsCache.add(r)}}return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}getAuthUrl(e){return`https://oauth.yandex.com/authorize?response_type=code&client_id=${C.yandexClientId}&redirect_uri=${e}&force_confirm=true`}}class M extends ${constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=this.baseFolder+"/"+t;for(;i.startsWith("/");)i=i.substring(1);const n=i.substring(0,i.lastIndexOf("/"));if(n){if(!(yield this.ensureDirectoryExists(n)))return console.error("Failed to create directory:",n),!1}const r=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/upload",{headers:{Authorization:`OAuth ${o}`,"Content-Type":"application/json"},params:{path:`/${i}`,overwrite:!0}});if(200!==r.status)return console.error("Error getting upload URL:",r),!1;const l=r.data.href;let s=t.split("/").pop()||"",d=new File([a],s,{lastModified:(new Date).getTime(),type:a.type});const c=yield e.put(l,d,{headers:{"Content-Type":a.type||"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0});return!(c.status>=300)||(console.error("Error occurred during file upload:",c),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);const i=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/download",{headers:{Authorization:`OAuth ${t}`,"Content-Type":"application/json"},params:{path:`/${o}`}});if(200!==i.status)return console.error("Error getting download URL:",i),!1;const n=i.data.href,r=yield e({url:n,method:"get",maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return r.status>=300?(console.error("Error occurred during file download:",r),!1):r.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class U{constructor(e){this.isExp=!1,this.folderIdCache=new Map,this.config=e,this.taskQueue=new k(3),this.isExp=this.config.isExp||!1,this.baseFolder="KoodoReader"}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getFileId(a,t){return m(this,void 0,void 0,(function*(){const o=this.config.access_token,i=`https://www.googleapis.com/drive/v3/files?q=name='${a}'+and+'${t}'+in+parents&fields=files(id,name)`;try{const a=yield e.get(i,{headers:{Authorization:"Bearer "+o}});if(0===a.data.files.length)return"";const t=a.data.files;return t.length>0?t[0].id:null}catch(e){return console.error("Error occurred during file list retrieval:",e),""}}))}checkFolder(a){return m(this,void 0,void 0,(function*(){a=this.baseFolder+"/"+a;const t=this.config.access_token;if(""===a)return"root";if(this.folderIdCache.has(a))return this.folderIdCache.get(a);const o=a.split("/").filter((e=>""!==e.trim()));let i="root",n="";for(const a of o){if(n=n?n+"/"+a:a,this.folderIdCache.has(n)){i=this.folderIdCache.get(n);continue}let o=yield this.getFolderId(a,i);if(!o){const n={name:a,mimeType:"application/vnd.google-apps.folder",parents:[i]};try{o=(yield e.post("https://www.googleapis.com/drive/v3/files",n,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.id}catch(e){throw console.error(`Error occurred during folder creation for ${a}:`,e),e}}this.folderIdCache.set(n,o),i=o}return i}))}getFolderId(a,t){return m(this,void 0,void 0,(function*(){const o=this.config.access_token,i=`https://www.googleapis.com/drive/v3/files?q=name='${a=encodeURIComponent(a)}'+and+mimeType='application/vnd.google-apps.folder'+and+'${t}'+in+parents&fields=files(id,name)`;try{const a=(yield e.get(i,{headers:{Authorization:`Bearer ${o}`}})).data.files;return a.length>0?a[0].id:null}catch(e){throw console.error("Error occurred during fetching folder ID:",e),e}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=yield this.checkFolder(a),i=[],n="",r=!0;for(;r;){let a=`https://www.googleapis.com/drive/v3/files?q='${o}'+in+parents&fields=nextPageToken,files(id,name,size,mimeType)&pageSize=1000`;n&&(a+=`&pageToken=${n}`);const l=yield e.get(a,{headers:{Authorization:`Bearer ${t}`}}),s=l.data.files||[];i=i.concat(s),n=l.data.nextPageToken,r=!!n}return[...new Set(i.map((e=>({name:e.name,size:e.size||0,type:"application/vnd.google-apps.folder"===e.mimeType?"folder":"file",modified:e.modifiedTime}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQue(e)}))))))}))}deleteFileWithoutQue(a){return m(this,void 0,void 0,(function*(){const t=a.split("/").pop()||"",o=a.split("/").slice(0,-1).join("/"),i=yield this.checkFolder(o),n=this.config.access_token,r=yield this.getFileId(t,i);if(""===r)return console.error("File not found:",t),!0;try{const a=yield e.delete(`https://www.googleapis.com/drive/v3/files/${r}`,{headers:{Authorization:`Bearer ${n}`}});return console.error("File deleted:",a),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${e}&prompt=consent&response_type=code&client_id=${C.googleClientId}&scope=https://www.googleapis.com/auth/${this.isExp?"drive":"drive.file"}&access_type=offline`}}class B extends U{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type}),r=t.split(".").pop(),l=p(r||""),s=t.split("/")[0],d=yield this.checkFolder(s),c=yield this.getFileId(i||"",d);const u={mimeType:l,name:i,parents:[d]},m=c?`https://www.googleapis.com/upload/drive/v3/files/${c}?uploadType=resumable`:"https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable",h=(yield e({method:c?"PATCH":"POST",url:m,data:c?null:JSON.stringify(u),headers:{Authorization:"Bearer "+o,"Content-Type":"application/json; charset=UTF-8"},maxContentLength:1/0,maxBodyLength:1/0})).headers.location,g=yield this.getData(n);if(0===Object.keys(g).length)return!1;const f=yield e.put(h,g.data,{headers:{Authorization:"Bearer "+o,"Content-Type":"application/zip","Content-Range":`bytes 0-${g.fileSize-1}/${g.fileSize}`},maxContentLength:1/0,maxBodyLength:1/0});return!(f.status>=300)||(console.error("Error occurred during file download:",f),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=a.split("/").pop(),i=a.split("/")[0],n=yield this.checkFolder(i),r=yield this.getFileId(o||"",n);if(!r)return console.error("File not found:",o),!0;const l=`https://www.googleapis.com/drive/v3/files/${r}?alt=media`,s=yield e.get(l,{headers:{Authorization:"Bearer "+t},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return s.status>=300?(console.error("Error occurred during file download:",s),!1):s.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getData(e){return m(this,void 0,void 0,(function*(){return e?new Promise(((a,t)=>{const o=new FileReader;o.onload=t=>a({fileName:e.name,mimeType:e.type,fileSize:e.size,data:t.target.result}),o.onerror=e=>t(e),o.readAsArrayBuffer(e)})):{}}))}}class z{constructor(e){this.folderCreationLocks=new Map,this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=2){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getStorage(){return m(this,void 0,void 0,(function*(){if(this.storage)return this.storage;let{email:e,password:t}=this.config;return this.storage=yield new a({email:e,password:t,userAgent:"KoodoReader/1.0"}).ready,this.storage}))}getRoot(){return m(this,void 0,void 0,(function*(){if(this.root)return this.root;const e=(yield this.getStorage()).root;if(""===this.baseFolder)return this.root=e,this.root;let a=e.children.find((e=>e.name===this.baseFolder&&e.directory));return a||(a=yield e.mkdir(this.baseFolder)),this.root=a,this.root}))}createFolder(e,a){return m(this,void 0,void 0,(function*(){const t=`${e.nodeId}_${a}`;if(this.folderCreationLocks.has(t))return yield this.folderCreationLocks.get(t);const o=(()=>m(this,void 0,void 0,(function*(){try{let t=e.children.find((e=>e.name===a&&e.directory));return t||(t=yield e.mkdir(a),t)}finally{this.folderCreationLocks.delete(t)}})))();return this.folderCreationLocks.set(t,o),yield o}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){try{let a=yield this.getRoot();if(e){const t=e.split("/").filter((e=>e));for(const e of t){const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return[];a=t}}return a.children.map((e=>({name:e.name,size:e.size||0,type:e.directory?"folder":"file",modified:e.timestamp?new Date(1e3*e.timestamp).toISOString():""})))}catch(e){return console.error("Error listing MEGA files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return m(this,void 0,void 0,(function*(){try{let a=yield this.getRoot();const t=e.split("/"),o=t.pop();for(const e of t){if(!e)continue;const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return!0;a=t}const i=a.children.find((e=>e.name===o&&!e.directory));return!i||(yield i.delete(),!0)}catch(e){return console.error("Error deleting MEGA file:",e),!1}}))}}class D extends z{constructor(e){super(e)}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{let o=yield this.getRoot();const i=a.split("/"),n=i.pop()||"";for(const e of i){if(!e)continue;let a=o.children.find((a=>a.name===e&&a.directory));a||(a=yield this.createFolder(o,e)),o=a}const r=new File([e],n,{lastModified:(new Date).getTime(),type:e.type}),l=yield e.arrayBuffer(),s=new Uint8Array(l),d=t.from(s),c=o.children.find((e=>e.name===n&&!e.directory));return c&&(yield c.delete()),yield o.upload({name:n,size:r.size},d).complete,!0}catch(e){return console.error("Error occurred during MEGA file upload:",e),!1}}))))))}))}downloadFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let a=yield this.getRoot();const t=e.split("/"),o=t.pop()||"";for(const e of t){if(!e)continue;const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return!0;a=t}const i=a.children.find((e=>e.name===o&&!e.directory));if(!i)return!0;const n=yield i.downloadBuffer();return this.taskQueue.setDownloadedSize(n.size),n.buffer}catch(e){return console.error("Error occurred during MEGA file download:",e),!1}}))))))}))}}class L{constructor(e){this.isExp=!1,this.baseUrl="https://graph.microsoft.com/v1.0/me/drive/special/approot",this.config=e,this.taskQueue=new k(3),this.isExp=this.config.isExp||!1,this.baseUrl=this.isExp?"https://graph.microsoft.com/v1.0/me/drive/root":"https://graph.microsoft.com/v1.0/me/drive/special/approot",void 0===this.config.baseFolder?this.baseFolder=this.isExp?"KoodoReader":"":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);let o,i=[];if(""===a)o=`${this.baseUrl}/children`;else{const e=encodeURIComponent(a);o=`${this.baseUrl}:/${e}:/children`}for(;o;){const a=yield e.get(o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(a.status>=300)break;const n=a.data.value||[];i=i.concat(n),o=a.data["@odata.nextLink"]||""}return[...new Set(i.map((e=>({name:e.name,size:e.size||0,type:e.folder?"folder":"file",modified:e.lastModifiedDateTime}))))]}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);const o=yield e.delete(`${this.baseUrl}:/${a}`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return!(o.status>=300)||(console.error("Error deleting file:",o),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${C.microsoftClientId}&scope=${this.isExp?"files.readwrite.all":"files.readwrite.appfolder"} offline_access&response_type=code&redirect_uri=${e}`}}class P extends L{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type}),r=this.baseFolder+"/"+t;for(;r.startsWith("/");)r=r.substring(1);const l=this.baseUrl+":/"+r+":/createUploadSession",s=yield e.post(l,null,{headers:{Authorization:"Bearer "+o,"Content-Type":"application/json"},maxContentLength:1/0,maxBodyLength:1/0});let d=n.size;const c=n.type,u=s.data.uploadUrl,m=yield e.put(u,n,{headers:{"Content-Type":c,"Content-Range":`bytes 0-${d-1}/${d}`},maxContentLength:1/0,maxBodyLength:1/0});return!(m.status>=300)||(console.error("Error occurred during file download:",m),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);const i=`${this.baseUrl}:/${o}:/content`,n=yield e.get(i,{responseType:"arraybuffer",headers:{Authorization:"Bearer "+t},maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error occurred during file download:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class j{downloadFile(e,a){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}listFiles(e){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e([])}))}))}getAuthUrl(){return""}}class K{constructor(e){this.baseUrl="https://api.pcloud.com",this.config=e,this.taskQueue=new k(3),this.baseUrl="2"===e.region?"https://eapi.pcloud.com":"https://api.pcloud.com"}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}checkFolderExists(a,t){return m(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:t,path:`/${a}`}})).data.result}catch(e){return console.error("Error checking folder:",e),!1}}))}createFolder(a,t){return m(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/createfolderifnotexists`,{params:{access_token:t,path:`/${a}`}})).data.result}catch(e){return console.error("Error creating folder:",e),!1}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:t,path:"/"+a,recursive:0}});return 0!==o.data.result?[]:o.data.metadata.contents.map((e=>({name:e.name,size:e.size||0,type:e.isfolder?"folder":"file",modified:e.modified})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/deletefile`,{params:{access_token:t,path:"/"+a}});return 0===o.data.result||(console.error("Error deleting file:",o.data),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://my.pcloud.com/oauth2/authorize?client_id=${C.pcloudClientId}&response_type=code&redirect_uri=${e}`}}class H extends K{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.refresh_token,i=t.split("/").slice(0,-1).join("/");if(!(yield this.checkFolderExists(i,o))){if(!(yield this.createFolder(i,o)))return!1}let n=t.split("/").pop()||"",r=new File([a],n,{lastModified:(new Date).getTime(),type:a.type});const l=new FormData;l.append("file",r);const s=yield e.post(`${this.baseUrl}/uploadfile`,l,{params:{access_token:o,path:`/${i}`,renew:1},maxContentLength:1/0,maxBodyLength:1/0});return 0===s.data.result||(console.error("Error uploading file:",s.data),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/getfilelink`,{params:{access_token:t,path:`/${a}`}});if(0!==o.data.result)return console.error("Error getting file link:",o.data),!0;const i=`https://${o.data.hosts[0]}${o.data.path}`,n=yield e.get(i,{responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error downloading file:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class J{constructor(e){this.config=e,this.taskQueue=new k(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=0){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}shouldUsePathStyle(){try{if(this.config.forcePathStyle&&"no"!==this.config.forcePathStyle)return!0;let e=this.config.endpoint;const a=new URL(e),t=a.hostname,o=/^(\d{1,3}\.){3}\d{1,3}$/.test(t),i=""!==a.port;return!o&&i}catch(e){return!0}}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){let{endpoint:a,region:t,bucketName:n,accessKeyId:r,secretAccessKey:l,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;let d=s+"/"+e;for(;d.startsWith("/");)d=d.substring(1);""===d||d.endsWith("/")||(d+="/");const c=new o({endpoint:a,region:t,credentials:{accessKeyId:r,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});try{let e,a=[],t=[],o=!0;for(;o;){const r=yield c.send(new i({Bucket:n,Prefix:d,Delimiter:"/",ContinuationToken:e}));r.Contents&&(a=a.concat(r.Contents)),r.CommonPrefixes&&(t=t.concat(r.CommonPrefixes)),e=r.NextContinuationToken,o=!!e}let r=[];return a.forEach((e=>{if(!e.Key.endsWith("/")){const a=e.Key.substring(d.length);a.includes("/")||r.push({name:a,size:e.Size||0,type:"file",modified:e.LastModified?e.LastModified.toISOString():""})}})),t.forEach((e=>{const a=e.Prefix.substring(d.length).replace(/\/$/,"");a&&r.push({name:a,size:0,type:"folder",modified:""})})),r}catch(e){return console.error(e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){let{endpoint:a,region:t,bucketName:i,accessKeyId:r,secretAccessKey:l,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;const d=new o({endpoint:a,region:t,credentials:{accessKeyId:r,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});let c=s+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{return yield d.send(new n({Bucket:i,Key:c})),!0}catch(e){return console.error(e),!1}}))}}class W extends J{constructor(e){super(e)}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:n,accessKeyId:l,secretAccessKey:s,dir:d}=this.config;const c=new o({endpoint:t,region:i,credentials:{accessKeyId:l,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});d=d&&"KoodoReader"===this.baseFolder?d:this.baseFolder;let u=d+"/"+a;for(;u.startsWith("/");)u=u.substring(1);try{let a=yield c.send(new r({Bucket:n,Key:u,Body:e}));return 200===a.$metadata.httpStatusCode||(console.error("Error uploading file:",a),!1)}catch(e){return console.error("Error: ",e),!1}}))))))}))}downloadFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let{endpoint:a,region:t,bucketName:i,accessKeyId:n,secretAccessKey:r,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;const d=new o({endpoint:a,region:t,credentials:{accessKeyId:n,secretAccessKey:r},forcePathStyle:this.shouldUsePathStyle()});let c=s+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{const e=yield d.send(new l({Bucket:i,Key:c}));if(!e.Body)return console.error("No response body"),!1;const a=yield e.Body.transformToByteArray();return this.taskQueue.setDownloadedSize(a.length),a.buffer}catch(a){return console.error("Error downloading file:",a,e),!1}}))))))}))}}class q{constructor(e){this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder;a&&""!==a.trim()&&(o=o+"/"+a),o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));let i=[],n=0;const r=1e3;for(;;){const a=yield e.get("https://pan.baidu.com/rest/2.0/xpan/file",{params:{method:"list",access_token:t,dir:"/"+o,start:n,limit:r,order:"name",desc:0,web:1,folder:0},headers:{"User-Agent":"pan.baidu.com"}});if(a.status>=300||0!==a.data.errno){console.error("百度网盘API错误:",a.data);break}const l=a.data.list||[];if(0===l.length)break;if(i=i.concat(l),l.length({name:e.server_filename,size:e.size||0,type:e.isdir?"folder":"file",modified:new Date(1e3*e.server_mtime).toISOString(),path:e.path,fs_id:e.fs_id})))}catch(e){return console.error("获取百度网盘文件列表时发生错误:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));const i=new URLSearchParams({async:"0",filelist:JSON.stringify(["/"+o])}),n=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=filemanager&access_token=${t}&opera=delete`,i.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==n.data.errno)return console.error("百度网盘删除文件API错误:",n.data),-9===n.data.errno?console.error("文件不存在"):111===n.data.errno?console.error("有其他异步任务正在执行"):-7===n.data.errno&&console.error("文件名非法"),!1;const r=n.data.info||[];for(const e of r)if(0!==e.errno)return console.error(`文件删除失败: ${e.path}, 错误码: ${e.errno}`),!1;return!0}catch(e){return console.error("删除文件时发生错误:",e),!1}}))}getAuthUrl(e){return`https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=${C.duboxClientId}&redirect_uri=${e}&scope=basic,netdisk&device_id=119827642&display=page&qrcode=1`}}const G=4194304;class Q extends q{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var o;try{const o=this.config.access_token;let i=this.baseFolder+"/"+t;i=i.replace(/\/+/g,"/"),i.startsWith("/")&&(i=i.substring(1));const n=yield a.arrayBuffer(),r=n.byteLength,l=new Uint8Array(n),{contentMd5:s,sliceMd5:d,blockList:c}=this.calculateFileMd5(l,r),u=new URLSearchParams({path:"/"+i,size:r.toString(),isdir:"0",autoinit:"1",rtype:"3",block_list:JSON.stringify(c),"content-md5":s,"slice-md5":d,local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),m=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=${o}`,u.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==m.data.errno)return console.error("预上传失败:",m.data),!1;const p=m.data.uploadid,h=m.data.block_list||[];if(0===h.length)return!0;const g=yield this.getUploadDomain(o,"/"+i,p);if(!g)return console.error("获取上传域名失败"),!1;for(const a of h){const t=a*G,n=Math.min(G,r-t),s=l.slice(t,t+n),d=new FormData;d.append("file",new Blob([s],{type:"application/octet-stream"}),`chunk_${a}`);const u=`${g}/rest/2.0/pcs/superfile2?method=upload&access_token=${o}&type=tmpfile&path=${encodeURIComponent("/"+i)}&uploadid=${p}&partseq=${a}`,m=yield e.post(u,d,{headers:{"User-Agent":"pan.baidu.com"},maxContentLength:1/0,maxBodyLength:1/0,timeout:0});if(m.status>=300)throw new Error(`分片上传失败: ${JSON.stringify(m.data)}`);const h=m.data.md5,f=c[a];h&&h!==f&&console.warn(`分片 ${a} MD5不匹配: 期望 ${f}, 实际 ${h}`)}const f=new URLSearchParams({path:"/"+i,size:r.toString(),isdir:"0",block_list:JSON.stringify(c),uploadid:p,rtype:"3",local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),y=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${o}`,f.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});return 0===y.data.errno||(console.error("创建文件失败:",y.data),!1)}catch(e){return console.error("文件上传过程中发生错误:",(null===(o=e.response)||void 0===o?void 0:o.data)||e.message||e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var t;this.taskQueue.setDownloadedSize(0);try{const o=this.config.access_token;let i=this.baseFolder+"/"+a;i=i.replace(/\/+/g,"/"),i.startsWith("/")&&(i=i.substring(1));const n=yield this.listFileInfos(a.substring(0,a.lastIndexOf("/"))),r=i.split("/").pop(),l=n.find((e=>e.name===r));if(!l)return console.error("文件不存在:",a),!1;const s=yield e.get("https://pan.baidu.com/rest/2.0/xpan/multimedia",{params:{method:"filemetas",access_token:o,fsids:JSON.stringify([l.fs_id]),dlink:1},headers:{"User-Agent":"pan.baidu.com"}});if(0!==s.data.errno||!(null===(t=s.data.list)||void 0===t?void 0:t[0]))return console.error("获取下载链接失败:",s.data),!1;const d=s.data.list[0].dlink;return(yield e.get(d,{responseType:"arraybuffer",params:{access_token:o},headers:{"User-Agent":"pan.baidu.com"},onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}})).data}catch(e){return console.error("下载文件时发生错误:",e),!1}}))))))}))}getUploadDomain(a,t,o){return m(this,void 0,void 0,(function*(){try{const i=yield e.get("https://d.pcs.baidu.com/rest/2.0/pcs/file",{params:{method:"locateupload",appid:"250528",access_token:a,path:t,uploadid:o,upload_version:"2.0"},headers:{"User-Agent":"pan.baidu.com"}});if(0!==i.data.error_code)return console.error("获取上传域名失败:",i.data),null;const n=i.data.servers||[],r=n.find((e=>e.server.startsWith("https://")));return r?r.server:n.length>0?n[0].server:(console.error("没有可用的上传服务器"),null)}catch(e){return console.error("获取上传域名时出错:",e),null}}))}calculateFileMd5(e,a){const t=[];let o="",i=0;for(;i=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getUploadCredentials(a){return m(this,void 0,void 0,(function*(){try{const t=yield e.get(`${this.baseUrl}/open/upload/get_token`,{headers:{Authorization:`Bearer ${a}`}});return t.status>=300||!t.data.state?(console.error("Error getting upload credentials:",t.data),null):t.data.data}catch(e){return console.error("Error occurred during get upload credentials:",e),null}}))}generateOSSPolicy(e,a,t=new Date(Date.now()+36e5)){const o={expiration:t.toISOString(),conditions:[{bucket:e},{key:a},["starts-with","$success_action_status","2"],["content-length-range",0,1073741824]]};return JSON.stringify(o)}getAuthUrl(e){return`https://passportapi.115.com/open/authorize?client_id=${C.yiyiwuClientId}&response_type=code&redirect_uri=${e}`}}class X extends Y{constructor(e){super(e)}sha1Hex(e){return m(this,void 0,void 0,(function*(){const a=yield crypto.subtle.digest("SHA-1",e);return Array.from(new Uint8Array(a)).map((e=>e.toString(16).padStart(2,"0"))).join("")}))}calculateFileSha1(e){return m(this,void 0,void 0,(function*(){try{const a=yield e.arrayBuffer();return this.sha1Hex(a)}catch(e){return console.error("Error calculating file SHA1:",e),""}}))}calculatePreSha1(e){return m(this,void 0,void 0,(function*(){try{const a=e.slice(0,131072),t=yield a.arrayBuffer();return this.sha1Hex(t)}catch(e){return console.error("Error calculating pre SHA1:",e),""}}))}calculateOSSSignature(e,a){const t=s.enc.Base64.stringify(s.enc.Utf8.parse(a));return s.HmacSHA1(t,e).toString(s.enc.Base64)}handleSecondAuth(e,a,t,o,i,n,r,l){return m(this,void 0,void 0,(function*(){try{if(!a.sign_check)return console.error("No sign_check provided for second authentication"),null;const[s,d]=a.sign_check.split("-"),c=parseInt(s),u=parseInt(d),m=t.slice(c,u+1),p=yield m.arrayBuffer(),h=(yield this.sha1Hex(p)).toUpperCase();return yield this.initializeUpload(e,o,i,n,r,l,a.sign_key,h,a.pick_code)}catch(e){return console.error("Error during second authentication:",e),null}}))}uploadToObjectStorage(a,t,o,i){var n;return m(this,void 0,void 0,(function*(){try{const n=i.endpoint,r=o.bucket,l=o.object;let s;if(n.includes(r))s=n;else{s=`https://${r}.${n.replace(/^https?:\/\//,"")}`}const d=this.generateOSSPolicy(r,l),c=this.calculateOSSSignature(i.AccessKeySecret,d),u=btoa(d),m=new FormData;if(m.append("key",l),m.append("policy",u),m.append("OSSAccessKeyId",i.AccessKeyId),m.append("signature",c),m.append("x-oss-security-token",i.SecurityToken),m.append("success_action_status","200"),o.callback&&o.callback.callback){const e=btoa(o.callback.callback);if(m.append("callback",e),o.callback.callback_var){const e=JSON.parse(o.callback.callback_var);for(const[a,t]of Object.entries(e))m.append(a,String(t))}}const p=new File([a],t,{type:a.type});m.append("file",p);const h=yield e.post(s,m,{maxContentLength:1/0,maxBodyLength:1/0});return 200===h.status||204===h.status||(console.error("Upload failed with status:",h.status),!1)}catch(e){return console.error("Error uploading file via REST API:",(null===(n=e.response)||void 0===n?void 0:n.data)||e.message||e),!1}}))}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var t;try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;o.startsWith("/")||(o="/"+o);const i=e.size,n=yield this.calculateFileSha1(e),r=yield this.calculatePreSha1(e),l=a.split("/").pop()||a,s=o.substring(0,o.lastIndexOf("/"))||"/";let d=yield this.getFolderInfo(s,!0),c="0";if(d)c=d.file_id;else{let e=yield this.createFolder(s);if(!e)return console.error("Failed to create folder:",s),!1;c=e}yield this.deleteFileWithoutQueue(a);let u=yield this.initializeUpload(c,l,i,n,r,t);if(!u)return console.error("Failed to initialize upload"),!1;if((6===u.status||7===u.status||8===u.status)&&(u=yield this.handleSecondAuth(c,u,e,l,i,n,r,t),!u))return console.error("Second authentication failed"),!1;if(2===u.status)return console.info(`File ${a} uploaded successfully via instant upload.`),!0;const m=yield this.getUploadCredentials(t);if(!m)return console.error("Failed to get upload credentials"),!1;return(yield this.uploadToObjectStorage(e,l,u,m))?(console.info(`File ${a} uploaded successfully.`),!0):(console.error("Failed to upload to object storage"),!1)}catch(e){return console.error("Error occurred during file upload:",(null===(t=e.response)||void 0===t?void 0:t.data)||e.message||e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let t=this.baseFolder+"/"+a;t=t.replace(/\/+/g,"/"),t.startsWith("/")||(t="/"+t);const o=yield this.getFolderInfo(t,!1);if(!o||!o.pick_code)return console.error("Failed to get file info or pick_code for:",a),!1;const i=yield this.getFileDownloadUrl(o.pick_code);if(!i)return console.error("Failed to get download URL for:",a),!1;const n=yield e.get(i.url,{responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error downloading file:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}initializeUpload(a,t,o,i,n,r,l,s,d){return m(this,void 0,void 0,(function*(){try{const c=new FormData;c.append("file_name",t),c.append("file_size",o.toString()),a?c.append("target","U_1_"+a):c.append("target","U_1_0"),c.append("fileid",i),c.append("preid",n),c.append("topupload","0"),d&&c.append("pick_code",d),l&&c.append("sign_key",l),s&&c.append("sign_val",s);const u=yield e.post(`${this.baseUrl}/open/upload/init`,c,{headers:{Authorization:`Bearer ${r}`,"Content-Type":"multipart/form-data"}});return u.status>=300||!u.data.state?(console.error("Error initializing upload:",u.data),null):u.data.data}catch(e){return console.error("Error occurred during upload initialization:",e),null}}))}createFolder(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=a.replace(/^\/+|\/+$/g,"");if(!o)return"";const i=o.split("/");let n="",r="0";for(const a of i){n=n?`${n}/${a}`:a;const o=yield this.getFolderInfo(n,!0);if(o&&o.file_id)r=o.file_id;else{const o=new FormData;o.append("pid",r),o.append("file_name",a);const i=yield e.post(`${this.baseUrl}/open/folder/add`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});if(i.status>=300||!i.data.state)return console.error("Error creating folder:",i.data),"";r=i.data.data.file_id}}return r}catch(e){return console.error("Error occurred during folder creation:",e),""}}))}getFolderInfo(a,t){return m(this,void 0,void 0,(function*(){if(""===a||"/"===a)return{file_id:"0"};a.startsWith("/")||(a="/"+a);try{const t=this.config.access_token,o=new FormData;o.append("path",a);const i=yield e.post(`${this.baseUrl}/open/folder/get_info`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});return i.status>=300||!i.data.state||0===i.data.data.length?(console.error("Error getting file info:",i.data),null):i.data.data}catch(e){return console.error("Error occurred during get file info:",e),null}}))}getFileDownloadUrl(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=new FormData;o.append("pick_code",a);const i=yield e.post(`${this.baseUrl}/open/ufile/downurl`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});if(i.status>=300)return console.error("Error getting download URL:",i.data),null;const n=i.data.data,r=Object.keys(n)[0];return r&&n[r]?n[r].url:(console.error("No file data found in download URL response"),null)}catch(e){return console.error("Error occurred during get download URL:",e.message||e),null}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;(a=this.baseFolder+"/"+a).startsWith("/")||(a="/"+a);let o=[],i=0;const n=1150;let r=!0,l=yield this.getFolderInfo(a,!0),s="";if(l)s=l.file_id;else{let e=yield this.createFolder(a);if(!e)return console.error("Failed to create folder:",a),[];s=e}if(!s)return console.error("Failed to get or create folder ID:",a),[];let d=s;for(;r;){const a={offset:i,limit:n,cur:1,show_dir:1};d&&(a.cid=d);const l=yield e.get(`${this.baseUrl}/open/ufile/files`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},params:a});if(l.status>=300)break;const s=l.data.data||[];o=o.concat(s),s.length({name:e.fn,size:e.fs||0,type:"0"===e.fc?"folder":"file",modified:new Date(1e3*e.upt).toISOString()})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;a=this.baseFolder+"/"+a;const o=yield this.getFolderInfo(a,!1);if(!o)return!0;const i=new FormData;i.append("file_ids",o.file_id);const n=yield e.post(`${this.baseUrl}/open/ufile/delete`,i,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});return!(n.status>=300||!n.data.state)||(console.error("Error deleting file:",n),!1)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}}class V{constructor(e){let{username:a,password:t,url:o,dir:i,AuthType:n,createClient:r}=e;void 0===e.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=e.baseFolder,i=i&&"KoodoReader"===this.baseFolder?i:this.baseFolder,this.username=a,this.password=t,this.url=o,this.dir=i,this.taskQueue=new k(5),this.AuthType=n,this.createClient=r}getClient(){return m(this,void 0,void 0,(function*(){return this.webdavClient||(this.url=yield this.handleUrlRedirection(this.url),this.webdavClient=this.createClient(this.url,{authType:this.AuthType.Password,username:this.username,password:this.password})),this.webdavClient}))}handleUrlRedirection(a){return m(this,void 0,void 0,(function*(){try{const t=yield e.head(a,{maxRedirects:0,validateStatus:()=>!0,timeout:5e3});return t.request&&t.request.responseURL&&t.request.responseURL!==a?t.request.responseURL:t.status>=300&&t.status<400&&t.headers.location?t.headers.location:a}catch(e){return console.info("Error handling URL redirection:",e),a}}))}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){const a=yield this.getClient();try{const t=a.getDirectoryContents(this.dir+"/"+e),o=new Promise(((e,a)=>{setTimeout((()=>a(new Error("WebDAV list directory timeout"))),5e3)}));return(yield Promise.race([t,o])).filter((a=>"."!==a.filename&&".."!==a.filename&&a.filename!==e)).map((e=>({name:e.basename,size:e.size||0,type:"directory"===e.type?"folder":"file",modified:e.lastmod})))}catch(t){return t.response&&404===t.response.status&&(yield a.createDirectory(this.dir+"/"+e)),console.error("Error listing files:",t),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){const a=yield this.getClient();try{return yield a.deleteFile(this.dir+"/"+e),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(e){return m(this,void 0,void 0,(function*(){let a=yield this.getClient();try{const t=e.replace(/^\/+|\/+$/g,"").split("/").filter((e=>e.length>0));let o="";for(const e of t)o=o?`${o}/${e}`:e,(yield a.exists(`/${o}`))||(yield a.createDirectory(`/${o}`));return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}}class Z extends V{constructor(e){super(Object.assign(Object.assign({},e),{AuthType:d,createClient:c}))}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{let o=this.dir+"/"+t,i=yield this.getClient();const n=i.exists(o.substring(0,o.lastIndexOf("/"))),r=new Promise(((e,a)=>{setTimeout((()=>a(new Error("WebDAV exists check timeout"))),5e3)}));!1===(yield Promise.race([n,r]))&&(yield this.ensureDirectoryExists(o.substring(0,o.lastIndexOf("/"))));let l=t.split("/").pop()||"",s=new File([a],l,{lastModified:(new Date).getTime(),type:a.type}),d=i.getFileUploadLink(this.dir+"/"+t);const c=new URL(d);c.search="",d=c.toString();const u=btoa(this.username+":"+this.password),m=yield e.put(d,s,{headers:{Authorization:"Basic "+u},maxContentLength:1/0,maxBodyLength:1/0});return!(m.status>=300)||(console.error("Error occurred during file upload:",m),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){if(this.taskQueue.setDownloadedSize(0),-1===a.indexOf("."))return new ArrayBuffer(0);try{const t=btoa(this.username+":"+this.password);let o=this.url.endsWith("/")?this.url:this.url+"/",i=this.dir.startsWith("/")?this.dir.substring(1):this.dir;const n=yield e({url:o+i+"/"+a,method:"get",headers:{Authorization:"Basic "+t},responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error occurred during file download:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ee{constructor(e){this.username=e.username,this.password=e.password,this.url=e.url,this.taskQueue=new k(3)}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{return(yield e.get(`${this.url}/list`,{params:{dir:a},auth:{username:this.username,password:this.password}})).data.files.map((e=>({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modifiedTime})))||[]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{return(yield e.delete(`${this.url}/delete`,{params:{dir:a.split("/").slice(0,-1).join("/")||"",filename:a.split("/").pop()},auth:{username:this.username,password:this.password}})).data.success}catch(e){return console.error("Error deleting file:",e),!1}}))}}class ae extends ee{constructor(e){super(e)}getAuthHeader(){return`Basic ${btoa(`${this.username}:${this.password}`)}`}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=t.split("/").pop()||"",i=t.substring(0,t.lastIndexOf("/"))||"";let n=this.listFiles("");const r=new Promise(((e,a)=>{setTimeout((()=>a(new Error("Docker connection timeout"))),5e3)}));yield Promise.race([n,r]);let l=new File([a],o,{lastModified:(new Date).getTime(),type:a.type});const s=new FormData;s.append("file",l);const d=yield e.post(`${this.url}/upload?dir=${encodeURIComponent(i)}`,s,{headers:{Authorization:this.getAuthHeader(),"Content-Type":"multipart/form-data"},maxContentLength:1/0,maxBodyLength:1/0});return!(d.status>=300)||(console.error("Error occurred during file upload:",d),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=a.split("/").pop()||"",o=a.substring(0,a.lastIndexOf("/"))||"",i=yield e({url:`${this.url}/download`,method:"GET",params:{dir:o,filename:t},headers:{Authorization:this.getAuthHeader()},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return i.status>=300?(console.error("Error occurred during file download:",i),!1):i.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}const te=["book","config","cover","font"];class oe{constructor(e,a){this.type=e,this.remote="dropbox"===e?new _(a):"microsoft"===e?new P(a):"google"===e?new B(a):"microsoft_exp"===e?new P(Object.assign(Object.assign({},a),{isExp:!0})):"google_exp"===e?new B(Object.assign(Object.assign({},a),{isExp:!0})):"s3compatible"===e?new W(a):"webdav"===e?new Z(a):"docker"===e?new ae(a):"boxnet"===e?new R(a):"mega"===e?new D(a):"adrive"===e?new I(a):"pcloud"===e?new H(a):"dubox"===e?new Q(a):"yandex"===e?new M(a):"yiyiwu"===e?new X(a):new j}downloadFile(e,a){return m(this,void 0,void 0,(function*(){if("cover"!==a){if(!(yield this.listFiles(a)).find((a=>e.indexOf(a)>-1)))return!1}return yield this.remote.downloadFile(a+"/"+e)}))}uploadFile(e,a,t){return m(this,void 0,void 0,(function*(){return 0===t.size||(yield this.remote.uploadFile(t,a+"/"+e))}))}deleteFile(e,a){return m(this,void 0,void 0,(function*(){return!(yield this.listFiles(a)).find((a=>e.indexOf(a)>-1))||(yield this.remote.deleteFile(a+"/"+e))}))}listFiles(e){return m(this,void 0,void 0,(function*(){return yield this.remote.listFiles(e)}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){return yield this.remote.listFileInfos(e)}))}isExist(e,a){return m(this,void 0,void 0,(function*(){return(yield this.listFiles(a)).find((a=>-1!==a.indexOf(e)))}))}downloadAllFiles(){return m(this,void 0,void 0,(function*(){for(let e of te){let a=yield this.listFiles(e);for(let t of a)yield this.downloadFile(t,e)}}))}getAuthUrl(e){return this.remote.getAuthUrl?this.remote.getAuthUrl(e):""}getStats(){return this.remote.taskQueue.getStats()}clearQueue(){return this.remote.taskQueue.clearQueue()}resetCounters(){this.remote.taskQueue.resetCounters()}getDownloadedSize(){return this.remote.taskQueue.getDownloadedSize()}}const ie={words:['ALTER TABLE words ADD COLUMN "sentence" text']},ne={notes:"SELECT * FROM notes WHERE key = ?",bookmarks:"SELECT * FROM bookmarks WHERE key = ?",books:"SELECT * FROM books WHERE key = ?",plugins:"SELECT * FROM plugins WHERE key = ?",words:"SELECT * FROM words WHERE key = ?"},re={notes:"SELECT * FROM notes WHERE bookKey = ?",bookmarks:"SELECT * FROM bookmarks WHERE bookKey = ?",words:"SELECT * FROM words WHERE bookKey = ?",books:"SELECT * FROM books WHERE key = ?"},le={notes:"DELETE FROM notes WHERE bookKey = ?",bookmarks:"DELETE FROM bookmarks WHERE bookKey = ?",words:"DELETE FROM words WHERE bookKey = ?"};function se(e){for(const a in e)e.hasOwnProperty(a)&&(e[`temp-${a}`]=e[a]);return e}const de={notes:e=>{let a=Object.assign({},e);return a.date=JSON.parse(e.date),a.tag=JSON.parse(e.tag),a},bookmarks:e=>e,books:e=>e,plugins:e=>{let a=Object.assign({},e);return e.autoValue||delete a.autoValue,e.langList?a.langList=JSON.parse(e.langList):delete a.langList,e.voiceList?a.voiceList=JSON.parse(e.voiceList):delete a.voiceList,a.config=JSON.parse(e.config),a},words:e=>{let a=Object.assign({},e);return a.date=JSON.parse(e.date),void 0===a.sentence&&(a.sentence=""),a}};var ce={sqlStatement:{createTableStatement:se({notes:'\n CREATE TABLE IF NOT EXISTS "notes" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "chapter" text,\n "chapterIndex" integer,\n "text" text,\n "cfi" text,\n "range" text,\n "notes" text,\n "percentage" text,\n "color" integer,\n "tag" array\n )\n ',bookmarks:'\n CREATE TABLE IF NOT EXISTS "bookmarks" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "cfi" text,\n "label" text,\n "percentage" text,\n "chapter" text\n );\n ',books:'\n CREATE TABLE IF NOT EXISTS "books" (\n "key" text PRIMARY KEY,\n "name" text,\n "author" text,\n "description" text,\n "md5" text,\n "cover" text,\n "format" text,\n "publisher" text,\n "size" integer,\n "page" integer,\n "path" text,\n "charset" text\n );\n ',plugins:'\n CREATE TABLE IF NOT EXISTS "plugins" (\n "key" text PRIMARY KEY,\n "type" text,\n "displayName" text,\n "icon" text,\n "version" text,\n "config" object,\n "autoValue" string,\n "langList" text,\n "voiceList" text,\n "scriptSHA256" text,\n "script" text\n );\n ',words:'\n CREATE TABLE IF NOT EXISTS "words" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "word" text,\n "sentence" text,\n "chapter" text\n );\n '}),migrateStatement:se(ie),getAllStatement:se({notes:"SELECT * FROM notes",bookmarks:"SELECT * FROM bookmarks",books:"SELECT * FROM books",plugins:"SELECT * FROM plugins",words:"SELECT * FROM words"}),getPagedStatement:se({notes:"SELECT * FROM notes LIMIT ? OFFSET ?",bookmarks:"SELECT * FROM bookmarks LIMIT ? OFFSET ?",books:"SELECT * FROM books LIMIT ? OFFSET ?",plugins:"SELECT * FROM plugins LIMIT ? OFFSET ?",words:"SELECT * FROM words LIMIT ? OFFSET ?"}),getCountStatement:se({notes:"SELECT COUNT(*) as count FROM notes",bookmarks:"SELECT COUNT(*) as count FROM bookmarks",books:"SELECT COUNT(*) as count FROM books",plugins:"SELECT COUNT(*) as count FROM plugins",words:"SELECT COUNT(*) as count FROM words"}),saveStatement:se({notes:"INSERT OR REPLACE INTO notes (key, bookKey, chapter, chapterIndex, text, cfi, range, notes, date, percentage, color, tag) VALUES (@key, @bookKey, @chapter, @chapterIndex, @text, @cfi, @range, @notes, @date, @percentage, @color, @tag)",bookmarks:"INSERT OR REPLACE INTO bookmarks (key, bookKey, cfi, label, percentage, chapter) VALUES (@key, @bookKey, @cfi, @label, @percentage, @chapter)",books:"INSERT OR REPLACE INTO books (key, name, author, description, md5, cover, format, publisher, size, page, path, charset) VALUES (@key, @name, @author, @description, @md5, @cover, @format, @publisher, @size, @page, @path, @charset)",plugins:"INSERT OR REPLACE INTO plugins (key, type, displayName, icon, version, config, autoValue, langList, voiceList, scriptSHA256, script) VALUES (@key, @type, @displayName, @icon, @version, @config, @autoValue, @langList, @voiceList, @scriptSHA256, @script)",words:"INSERT OR REPLACE INTO words (key, bookKey, date, word, sentence, chapter) VALUES (@key, @bookKey, @date, @word, @sentence, @chapter)"}),deleteAllStatement:se({notes:"DELETE FROM notes",bookmarks:"DELETE FROM bookmarks",books:"DELETE FROM books",plugins:"DELETE FROM plugins",words:"DELETE FROM words"}),updateStatement:se({notes:"UPDATE notes SET bookKey = @bookKey, chapter = @chapter, chapterIndex = @chapterIndex, text = @text, cfi = @cfi, range = @range, notes = @notes, date = @date, percentage = @percentage, color = @color, tag = @tag WHERE key = @key",bookmarks:"UPDATE bookmarks SET bookKey = @bookKey, cfi = @cfi, label = @label, percentage = @percentage, chapter = @chapter WHERE key = @key",books:"UPDATE books SET name = @name, author = @author, description = @description, md5 = @md5, cover = @cover, format = @format, publisher = @publisher, size = @size, page = @page, path = @path, charset = @charset WHERE key = @key",plugins:"UPDATE plugins SET type = @type, displayName = @displayName, icon = @icon, version = @version, config = @config, autoValue = @autoValue, langList = @langList, voiceList = @voiceList, scriptSHA256 = @scriptSHA256, script = @script WHERE key = @key",words:"UPDATE words SET bookKey = @bookKey, date = @date, word = @word, sentence = @sentence, chapter = @chapter WHERE key = @key"}),deleteStatement:se({notes:"DELETE FROM notes WHERE key = ?",bookmarks:"DELETE FROM bookmarks WHERE key = ?",books:"DELETE FROM books WHERE key = ?",plugins:"DELETE FROM plugins WHERE key = ?",words:"DELETE FROM words WHERE key = ?"}),dropStatement:se({notes:"DROP TABLE IF EXISTS notes",bookmarks:"DROP TABLE IF EXISTS bookmarks",books:"DROP TABLE IF EXISTS books",plugins:"DROP TABLE IF EXISTS plugins",words:"DROP TABLE IF EXISTS words"}),getStatement:se(ne),getByBookKeyStatement:se(re),getByBookKeysStatement:se({notes:e=>`SELECT * FROM notes WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,bookmarks:e=>`SELECT * FROM bookmarks WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,words:e=>`SELECT * FROM words WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")})`}),getKeysStatement:se({notes:"SELECT key FROM notes",bookmarks:"SELECT key FROM bookmarks",books:"SELECT key FROM books",plugins:"SELECT key FROM plugins",words:"SELECT key FROM words"}),getWithSortAndPageStatement:se({notes:(e,a,t,o)=>`SELECT * FROM notes ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,bookmarks:(e,a,t,o)=>`SELECT * FROM bookmarks ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,books:(e,a,t,o)=>`SELECT * FROM books ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,plugins:(e,a,t,o)=>`SELECT * FROM plugins ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,words:(e,a,t,o)=>`SELECT * FROM words ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`}),getByKeysStatement:se({notes:e=>`SELECT * FROM notes WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,bookmarks:e=>`SELECT * FROM bookmarks WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,plugins:e=>`SELECT * FROM plugins WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,words:e=>`SELECT * FROM words WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`}),deleteByBookKeyStatement:se(le)},jsonToSqlite:se({notes:e=>{let a=Object.assign({},e);return a.date=JSON.stringify(e.date),a.tag=JSON.stringify(e.tag),a},bookmarks:e=>e,books:e=>{let a=Object.assign({},e);return a.page=e.page||0,a},plugins:e=>{let a=Object.assign({},e);return e.autoValue||(a.autoValue=null),e.langList?a.langList=JSON.stringify(e.langList):a.langList=null,e.voiceList?a.voiceList=JSON.stringify(e.voiceList):a.voiceList=null,a.config=JSON.stringify(e.config),a},words:e=>{let a=Object.assign({},e);return a.date=JSON.stringify(e.date),void 0===a.sentence&&(a.sentence=""),a}}),sqliteToJson:se(de)};const ue=E.cloudUrl,me=E.cloudCNUrl;class pe{constructor(e,a,t){this.TokenService=e,this.ConfigService=a,this.baseUrl="china"===t?me:ue,this.serverRegion=t,this.refreshToken="",this.accessToken="",this.streamPromise=null,this.expiresAt=0}refreshUserToken(){return m(this,void 0,void 0,(function*(){if(this.refreshToken=yield this.TokenService.getToken("refresh_token"),!this.refreshToken)return{code:401,message:"refresh token not found"};let a=(yield e.post(this.baseUrl+"/api/v1/public/user/refresh_token",{refresh_token:this.refreshToken})).data;return 200===a.code&&(yield this.TokenService.setToken("access_token",a.data.access_token),yield this.TokenService.setToken("refresh_token",a.data.refresh_token),yield this.TokenService.setToken("expires_at",(1e3*a.data.expires_at).toString()),this.accessToken=a.data.access_token,this.refreshToken=a.data.refresh_token,this.expiresAt=1e3*a.data.expires_at),a}))}requestWithRetry(e){return m(this,void 0,void 0,(function*(){return pe.requestQueue||(pe.requestQueue=[]),new Promise(((a,t)=>{pe.requestQueue.push({config:e,resolve:a,reject:t}),pe.processingQueue||this.processQueue()}))}))}isTokenValid(){return m(this,void 0,void 0,(function*(){if(this.accessToken||(this.accessToken=(yield this.TokenService.getToken("access_token"))||""),!this.expiresAt){const e=yield this.TokenService.getToken("expires_at");this.expiresAt=e?parseInt(e):(new Date).getTime()+31536e9}return""!==this.accessToken&&this.expiresAt>(new Date).getTime()+6e4}))}processQueue(){return m(this,void 0,void 0,(function*(){if(!pe.processingQueue){pe.processingQueue=!0;try{for(;pe.requestQueue.length>0;){const e=pe.requestQueue.shift();try{let a=yield this.executeRequest(e.config);e.resolve(a)}catch(a){e.reject(a)}}}finally{pe.processingQueue=!1}}}))}executeRequest(a){return m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let t="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);if(a.baseURL=this.baseUrl,a.headers)a.headers.Authorization="Bearer "+this.accessToken,a.headers["X-Request-ID"]=t;else{let e=this.ConfigService.getItem("appVersion"),o=this.ConfigService.getItem("appPlatform");a.headers={Authorization:"Bearer "+this.accessToken,"X-Request-ID":t,"X-App-Version":e||"1.0.0","X-App-Platform":o||"web"}}let o=(yield e(a)).data;if(402===o.code){let t=yield this.refreshUserToken();if(200===t.code){return a.headers=a.headers||{},a.headers.Authorization="Bearer "+this.accessToken,(yield e(a)).data}return t}return 200!==o.code&&console.error("Request error:",o),o}catch(e){return console.error("Request execution error:",e),"Network Error"===e.message?{code:503,message:"network error",data:null,msg:"Network error, please try again later. 网络错误,请稍后再试。"}:{code:500,message:e.message||"Unknown error",msg:e.message||"Unknown error",data:null}}}))}requestWithStream(e,a,t){return m(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let o=this.accessToken||"",i="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((n,r)=>{let l=this.ConfigService.getItem("appVersion"),s=this.ConfigService.getItem("appPlatform");const d=new t(this.baseUrl+e.url,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+o,"X-Request-ID":i,"X-App-Version":l||"1.0.0","X-App-Platform":s||"web"},method:e.method,body:JSON.stringify(e.data),pollingInterval:0});d.addEventListener("open",(()=>{console.info("Connection to OpenAI established.")})),d.addEventListener("message",(e=>m(this,void 0,void 0,(function*(){if(!e.data)return;const t=JSON.parse(e.data);t.done?(d.close(),n(t)):a(t.data)})))),d.addEventListener("error",(e=>{if(console.info("Error:",e),!e.data)return;const t=JSON.parse(e.data);a(t.data),n(t),d.close()}))}))}finally{this.streamPromise=null}})))()),this.streamPromise}))}requestWithFetch(e,a){return m(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let t=this.accessToken||"",o="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((i,n)=>m(this,void 0,void 0,(function*(){let n=this.ConfigService.getItem("appVersion"),r=this.ConfigService.getItem("appPlatform");var l=new u(this.baseUrl+e.url,{headers:{"Content-Type":"text/plain",Authorization:"Bearer "+t,"X-Request-ID":o,"X-App-Version":n||"1.0.0","X-App-Platform":r||"web"},payload:JSON.stringify(e.data),method:"POST"});l.addEventListener("message",(e=>m(this,void 0,void 0,(function*(){if(!e.data)return;const t=JSON.parse(e.data);t.done?(l.close(),i(t)):a(t.data)})))),l.addEventListener("open",(e=>{console.info(e,"Connection to OpenAI established.")})),l.addEventListener("error",(e=>{if(console.error(e,"Error occurred while connecting to OpenAI"),!e.data)return;const t=JSON.parse(e.data);a(t.data),i(t),l.close()}))}))))}finally{this.streamPromise=null}})))()),this.streamPromise}))}}pe.processingQueue=!1,pe.requestQueue=[];class he extends pe{constructor(e,a,t){super(e,a,t)}getTransStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_trans_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getTransFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_trans_stream",data:e};return yield this.requestWithFetch(t,a)}))}getDictionary(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_dict",data:e};return yield this.requestWithRetry(a)}))}getBatchTrans(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_batch_trans",data:e};return yield this.requestWithRetry(a)}))}getSplitSentence(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_split_sentence",data:e};return yield this.requestWithRetry(a)}))}getAnswerStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_answer_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getAnswerFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_answer_stream",data:e};return yield this.requestWithFetch(t,a)}))}getSummaryStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_sum_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getSummaryFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_sum_stream",data:e};return yield this.requestWithFetch(t,a)}))}getDictionaryStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_dict_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getDictionaryFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_dict_stream",data:e};return yield this.requestWithFetch(t,a)}))}getGoogleFont(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_google_font",data:e};return yield this.requestWithRetry(a)}))}sendToKindle(e,a){return m(this,void 0,void 0,(function*(){let t=new FormData;t.append("file",e.file),t.append("email",e.email),t.append("file_name",e.fileName);const o={method:"post",url:"/api/v1/pro/reader/send_to_kindle",headers:{"Content-Type":"multipart/form-data"},data:t,onUploadProgress:a?t=>{var o;const i=t.total||(null===(o=e.file)||void 0===o?void 0:o.size)||0;i>0&&a(Math.min(t.loaded/i,1))}:void 0};return yield this.requestWithRetry(o)}))}detectLanguage(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/detect_language",data:e};return yield this.requestWithRetry(a)}))}getTTSAudio(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_tts_audio",data:e};return yield this.executeRequest(a)}))}getOcrResult(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_ocr_result",data:e};return yield this.executeRequest(a)}))}getOcrResultV2(e){return m(this,void 0,void 0,(function*(){let a=new FormData;a.append("file",e.file);const t={method:"post",url:"/api/v1/pro/reader/get_ocr_result_v2",headers:{"Content-Type":"multipart/form-data"},data:a};return yield this.executeRequest(t)}))}analyzeText(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/analyze_text",data:e};return yield this.requestWithRetry(a)}))}getBookMetadata(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_book_metadata",data:e};return yield this.requestWithRetry(a)}))}analyzeBookTitle(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/analyze_book_title",data:e};return yield this.requestWithRetry(a)}))}}class ge extends pe{constructor(e,a,t){super(e,a,t),this.serverRegion=t}encryptToken(e){return m(this,void 0,void 0,(function*(){let a=e.token,t=v.encode(a),{extracted:o,remaining:i}=function(e){let a="",t="",o=[],i=1;for(;i<=e.length;)o.push(i-1),i*=2;for(let i=0;i-1){let t=a.split("#");e.encrypted_token=t[1]}const t={method:"post",url:"/api/v1/pro/thirdparty/decrypt_token",data:e};let o=yield this.requestWithRetry(t);if(a.indexOf("#")>-1&&o.data&&o.data.token){let e=a.split("#"),t=function(e,a){let t="",o=[],i=1,n=e.length+a.length;for(;i<=n;)o.push(i-1),i*=2;let r=0,l=0;for(let i=0;i{let o="";if("github"===e?o=`https://github.com/login/oauth/authorize?client_id=${C.githubClientId}&redirect_uri=${t}&scope=${T.github.scopes.join(" ")}&response_type=code`:"google"===e?o=`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${t}&prompt=consent&response_type=code&client_id=${C.googleClientId}&scope=${T.google.scopes.join(" ")}&access_type=offline`:"facebook"===e?o=`https://www.facebook.com/v12.0/dialog/oauth?client_id=${C.facebookClientId}&redirect_uri=${t}&scope=&response_type=code`:"microsoft"===e&&(o=`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${C.microsoftClientId}&scope=${T.microsoft.scopes.join(" ")}&response_type=code&redirect_uri=${t}`),"manual"===a)return o;let i=JSON.stringify({deeplink:"desktop"===a?"koodo-reader://callback":"browser"===a?`${C.callbackUrl}#/login`:"",service:e});return`${o}&state=${"state|"+encodeURIComponent(i)}`}};class Ne{static CompareDatabase(e,a,t){return m(this,void 0,void 0,(function*(){let o=Object.keys(e).filter((e=>e.startsWith("database.sqlite.books"))),i=Object.keys(e).filter((e=>e.startsWith("database.sqlite.notes"))),n=Object.keys(e).filter((e=>e.startsWith("database.sqlite.bookmarks"))),r=Object.keys(e).filter((e=>e.startsWith("database.sqlite.plugins"))),l=Object.keys(e).filter((e=>e.startsWith("database.sqlite.words"))),s=Object.keys(a).filter((e=>e.startsWith("database.sqlite.books"))),d=Object.keys(a).filter((e=>e.startsWith("database.sqlite.notes"))),c=Object.keys(a).filter((e=>e.startsWith("database.sqlite.bookmarks"))),u=Object.keys(a).filter((e=>e.startsWith("database.sqlite.plugins"))),m=Object.keys(a).filter((e=>e.startsWith("database.sqlite.words"))),p={books:Array.from(new Set(o.concat(s))),notes:Array.from(new Set(i.concat(d))),bookmarks:Array.from(new Set(n.concat(c))),plugins:Array.from(new Set(r.concat(u))),words:Array.from(new Set(l.concat(m)))},h={books:{save:[],update:[],delete:[],conflict:[],upload:[]},notes:{save:[],update:[],delete:[],conflict:[],upload:[]},bookmarks:{save:[],update:[],delete:[],conflict:[],upload:[]},plugins:{save:[],update:[],delete:[],conflict:[],upload:[]},words:{save:[],update:[],delete:[],conflict:[],upload:[]}},g=["books","notes","bookmarks","plugins","words"];for(let o of g)for(let i of p[o]){let n=i.split(".")[3],r=e[i],l=a[i];r?l?("save"===l.operation&&("update"!==r.operation&&"delete"!==r.operation||h[o].upload.push(n)),"delete"===l.operation&&("save"===r.operation&&(h[o].delete.push(n),e[i]=l),"update"===r.operation&&(r.timel.time&&(h[o].conflict.push(n),"cloud"===t?(h[o].delete.push(n),e[i]=l):h[o].upload.push(n))),r.operation),"update"===l.operation&&("save"===r.operation&&(h[o].update.push(n),e[i]=l),"update"===r.operation&&(r.timel.time&&h[o].upload.push(n)),"delete"===r.operation&&(r.timel.time&&h[o].upload.push(n)))):h[o].upload.push(n):(h[o].save.push(n),e[i]=l)}return{compareResult:h,syncRecords:e}}))}static CompareConfig(e,a,t){return m(this,void 0,void 0,(function*(){let o=Object.keys(e).filter((e=>e.startsWith("config.readerConfig"))),i=Object.keys(e).filter((e=>e.startsWith("config.listConfig"))),n=Object.keys(e).filter((e=>e.startsWith("config.objectConfig"))),r=Object.keys(e).filter((e=>e.startsWith("config.mapConfig"))),l=Object.keys(a).filter((e=>e.startsWith("config.readerConfig"))),s=Object.keys(a).filter((e=>e.startsWith("config.listConfig"))),d=Object.keys(a).filter((e=>e.startsWith("config.objectConfig"))),c=Object.keys(a).filter((e=>e.startsWith("config.mapConfig"))),u={readerConfig:Array.from(new Set(o.concat(l))),listConfig:Array.from(new Set(i.concat(s))),objectConfig:Array.from(new Set(n.concat(d))),mapConfig:Array.from(new Set(r.concat(c)))},m={readerConfig:{update:[],upload:[]},listConfig:{update:[],upload:[]},objectConfig:{update:[],delete:[],conflict:[],save:[],upload:[]},mapConfig:{update:[],delete:[],conflict:[],save:[],upload:[]}},p=["readerConfig","listConfig"];for(let t of p)for(let o of u[t]){let i=o,n=e[o],r=a[o];n?r?n.timer.time&&m[t].upload.push(i):m[t].upload.push(i):(m[t].update.push(i),e[o]=r)}let h=["objectConfig","mapConfig"];for(let o of h)for(let i of u[o]){let n=i,r=e[i],l=a[i];r?l?("delete"===l.operation&&("update"===r.operation&&(r.timel.time&&(m[o].conflict.push(n),"cloud"===t?(m[o].delete.push(n),e[i]=l):m[o].upload.push(n))),r.operation),"update"===l.operation&&("update"===r.operation&&(r.timel.time&&m[o].upload.push(n)),"delete"===r.operation&&(r.timel.time&&m[o].upload.push(n)))):m[o].upload.push(n):(m[o].update.push(n),e[i]=l)}return{compareResult:m,syncRecords:e}}))}static compareAll(e,a,t,o,i){return m(this,void 0,void 0,(function*(){let n="cloud";if("yes"===t.getReaderConfig("isKeepLocal")){n="local";let e=t.getObjectConfig(yield o.getFingerprint(),"cloudSyncTime",{time:0,conflictMode:"cloud"}),a=yield i.getCloudConfig("config"),r=JSON.parse(a.cloudSyncTime||"{}");delete r[yield o.getFingerprint()],Object.values(r).filter((a=>"local"===a.conflictMode&&a.time>e.time)).length>0&&(n="cloud")}let{compareResult:r,syncRecords:l}=yield this.CompareDatabase(e,a,n),{compareResult:s,syncRecords:d}=yield this.CompareConfig(l,a,n),c=Object.assign(Object.assign({},r),s);return t.setAllSyncRecord(d),"local"===n&&(c.books.conflict.length>0||c.notes.conflict.length>0||c.bookmarks.conflict.length>0||c.plugins.conflict.length>0||c.words.conflict.length>0||c.objectConfig.conflict.length>0||c.mapConfig.conflict.length>0)?t.setObjectConfig(yield o.getFingerprint(),{time:(new Date).getTime(),conflictMode:"local"},"cloudSyncTime"):t.setObjectConfig(yield o.getFingerprint(),{time:(new Date).getTime(),conflictMode:"cloud"},"cloudSyncTime"),c}))}static startSync(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){let r=yield this.syncConfig(e,a,t,i,n,o);if(e.books.save.length>0||e.books.upload.length>0){let e=yield this.syncCover(a,n,i),t=yield this.syncBook(a,i);return[...r,...e,...t]}return r}))}static syncConfig(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){let r=[];for(let a of h){if(e[a].save.length+e[a].update.length>0){let o=yield n.getCloudDatabase(a);for(let i of e[a].save){let e=o.find((e=>e.key===i));e&&(yield t.saveRecord(e,a))}for(let i of e[a].update){let e=o.find((e=>e.key===i));e&&(yield t.updateRecord(e,a,!1))}}if(e[a].delete.length>0)for(let n of e[a].delete)"books"===a&&(yield o.deleteOfflineBook(n),yield i.deleteOfflineCover(n)),yield t.deleteRecord(n,a);yield t.dumpDatabase(a,!0)}if(e.readerConfig.update.length>0||e.listConfig.update.length>0||e.objectConfig.update.length>0||e.mapConfig.update.length>0){let t=yield n.getCloudConfig("config");for(let o of e.readerConfig.update){let e=o.split(".")[3];t.readerConfig&&a.setReaderConfig(e,JSON.parse(t.readerConfig)[e],!1)}for(let o of e.listConfig.update){let e=o.split(".")[3];t[e]&&a.setAllListConfig(JSON.parse(t[e]),e,!1)}for(let o of e.objectConfig.update){let e=o.split(".")[3],i=o.split(".")[2];t[i]&&JSON.parse(t[i])&&JSON.parse(t[i])[e]&&a.setObjectConfig(e,JSON.parse(t[i])[e],i,!1)}for(let o of e.mapConfig.update){let e=o.split(".")[3],i=o.split(".")[2];if(t[i]&&JSON.parse(t[i])&&JSON.parse(t[i])[e]){let o=JSON.parse(t[i])[e];a.setOneMapConfig(e,o,i,!1)}}}if(e.objectConfig.delete.length>0||e.mapConfig.delete.length>0){for(let t of e.objectConfig.delete){let e=t.split(".")[3],o=t.split(".")[2];a.deleteObjectConfig(e,o)}for(let t of e.mapConfig.delete){let e=t.split(".")[3],o=t.split(".")[2];a.deleteMapConfig(e,o)}}for(let a of h)e[a].upload.length>0&&r.push((()=>n.uploadDatabase(a)));return r.push((()=>n.uploadConfig("config"))),r.push((()=>n.uploadConfig("sync"))),r}))}static syncCover(e,a,t){return m(this,void 0,void 0,(function*(){let t=yield a.getLocalCoverList(),o=yield a.getCloudCoverList(),i=Array.from(new Set([...t,...o])),n=[];for(let r of i)t.includes(r)&&!o.includes(r)&&n.push((()=>a.uploadCover(r))),!t.includes(r)&&o.includes(r)&&"adrive"!==e.getItem("defaultSyncOption")&&n.push((()=>a.downloadCover(r)));return n}))}static syncBook(e,a){return m(this,void 0,void 0,(function*(){let t=yield a.getLocalBookList(),o=yield a.getCloudBookList(),i=[],n=Array.from(new Set([...t,...o]));for(let r of n){if(t.includes(r)&&!o.includes(r)){let e=r.split(".")[0],t=r.split(".")[1];i.push((()=>a.uploadBook(e,t)))}let n="yes"===e.getReaderConfig("autoOffline");if(!t.includes(r)&&o.includes(r)&&n&&"adrive"!==e.getItem("defaultSyncOption")){let e=r.split(".")[0],t=r.split(".")[1]||"epub";i.push((()=>a.offlineBook(e,t.toUpperCase())))}}return i}))}static runTasksWithLimit(e,a,t){return m(this,void 0,void 0,(function*(){if("ftp"!==t&&"adrive"!==t){const t=[],o=[];for(const i of e){const e=i().then((a=>(o.splice(o.indexOf(e),1),a)));t.push(e),o.push(e),o.length>=a&&(yield Promise.race(o))}return Promise.all(t)}for(let a of e)yield a()}))}}class ve{constructor(e,a){this.bookKey="",this.sessionStart=0,this.unregisterUnload=null,this.configService=e,this.platform=a}getDailySeconds(e,a){const t=((this.configService.getAllMapConfig("readingStats")||{})[a]||[]).find((a=>a.startsWith(e+"-")));if(!t)return 0;const o=t.split("-");return parseInt(o[o.length-1],10)||0}setDailySeconds(e,a,t){const o=(this.configService.getAllMapConfig("readingStats")||{})[a]||[],i=`${e}-${t}`,n=o.filter((a=>!a.startsWith(e+"-")));this.configService.setOneMapConfig(a,[...n,i],"readingStats")}start(e){this.bookKey=e,this.sessionStart=Date.now(),this.unregisterUnload=this.platform.registerUnloadHandler((()=>{var e,a;this.commit(),null===(a=(e=this.platform).onBeforeClose)||void 0===a||a.call(e)}))}stop(){var e;this.commit(),null===(e=this.unregisterUnload)||void 0===e||e.call(this),this.unregisterUnload=null,this.bookKey="",this.sessionStart=0}commit(){if(!this.bookKey||!this.sessionStart)return;const e=Date.now()-this.sessionStart;if(e<1e3)return void(this.sessionStart=0);const a=Math.round(e/1e3);this.sessionStart=0;const t=this.configService.getObjectConfig(this.bookKey,"readingTime",0);this.configService.setObjectConfig(this.bookKey,t+a,"readingTime");const o=function(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}(),i=this.getDailySeconds(this.bookKey,o);this.setDailySeconds(this.bookKey,o,i+a)}getTotalSeconds(e){return this.configService.getObjectConfig(e,"readingTime",0)}getDailySecondsForBook(e,a){return this.getDailySeconds(e,a)}getDayStats(e){return((this.configService.getAllMapConfig("readingStats")||{})[e]||[]).map((e=>{const a=e.lastIndexOf("-");return{bookKey:e.substring(0,a),seconds:parseInt(e.substring(a+1),10)||0}}))}getAllDates(){const e=this.configService.getAllMapConfig("readingStats");return Object.keys(e||{})}}const be="Koodo Reader",ke="application/vnd.koreader.v1+json";class Se extends Error{constructor(e,a,t,o){super(e),this.name="KOReaderRequestError",this.status=a,this.code=t,this.body=o}}const Ee=e=>{const a=(e||"").trim();if(!a)return"";return(/^https?:\/\//i.test(a)?a:`https://${a}`).replace(/\/+$/,"")},Ce=e=>{const a="number"==typeof e?e:parseFloat((e||"0")+"");return!isFinite(a)||isNaN(a)?0:a>1&&a<=100?Math.min(Math.max(a/100,0),1):Math.min(Math.max(a,0),1)},Te=(e,a={})=>m(void 0,void 0,void 0,(function*(){const t=yield fetch(e,a);return t.ok||(yield(e=>m(void 0,void 0,void 0,(function*(){let a=null;try{a=yield e.json()}catch(t){try{a=yield e.text()}catch(e){a=null}}const t=(null==a?void 0:a.message)||(null==a?void 0:a.error)||(null==a?void 0:a.msg)||("string"==typeof a?a:"")||e.statusText||"Request failed";throw console.error(`[KOReader] HTTP ${e.status} error: ${t}`,null!=a?a:"(no body)"),new Se(t,e.status,null==a?void 0:a.code,a)})))(t)),204===t.status?{}:yield t.json()})),we=e=>({Accept:ke,"Content-Type":"application/json","x-auth-user":e.username,"x-auth-key":e.passwordHash});class Ae{constructor(e,a,t){this.getKOReaderSyncConfig=()=>{let e;try{e=this.ConfigService.getObjectConfig("koReaderSyncConfig","thirdpartyToken",{})}catch(e){return console.error("[KOReader] Failed to read koReaderSyncConfig:",e),null}if(!e||"object"!=typeof e)return console.error("[KOReader] koReaderSyncConfig is missing or invalid"),null;const a=Ee(e.serverUrl||""),t=(e.username||"").trim(),o=(e.passwordHash||"").trim();return a&&t&&o?{serverUrl:a,username:t,passwordHash:o}:(console.error("[KOReader] Incomplete config — missing fields"),null)},this.getLocalRecordLocation=e=>this.ConfigService.getObjectConfig(e,"recordLocation",{})||{},this.persistKOReaderMetadata=(e,a,t)=>{const o=Object.assign(Object.assign({},a),{percentage:t.percentage.toString(),xpath:t.progress,timestamp:t.timestamp||parseInt(Date.now()/1e3+"")});this.ConfigService.setObjectConfig(e,o,"recordLocation")},this.authUser=e=>m(this,void 0,void 0,(function*(){return yield Te(`${e.serverUrl}/users/auth`,{method:"GET",headers:we(e)})})),this.createUser=e=>m(this,void 0,void 0,(function*(){return yield Te(`${e.serverUrl}/users/create`,{method:"POST",headers:{Accept:ke,"Content-Type":"application/json"},body:JSON.stringify({username:e.username,password:e.passwordHash})})})),this.getBookProgress=(e,a)=>m(this,void 0,void 0,(function*(){const t=yield Te(`${e.serverUrl}/syncs/progress/${encodeURIComponent(a)}`,{method:"GET",headers:we(e)});return t&&0!==Object.keys(t).length?{document:a,percentage:Ce(t.percentage),progress:t.progress||"",device:t.device||"",device_id:t.device_id||"",timestamp:t.timestamp||0}:null})),this.updateBookProgress=(e,a)=>m(this,void 0,void 0,(function*(){yield Te(`${e.serverUrl}/syncs/progress`,{method:"PUT",headers:we(e),body:JSON.stringify({document:a.document,percentage:a.percentage,progress:a.progress,device:a.device||be,device_id:a.device_id||"",timestamp:a.timestamp||parseInt(Date.now()/1e3+"")})})})),this.buildLocalUploadPayload=(e,a,t,o)=>m(this,void 0,void 0,(function*(){const i=Ce(a.percentage),n=a.xpath||"",r=this.ConfigService.getObjectConfig(e.key,"koreaderBooks",{});if(!r.document){let a=yield o(e);if(!a)return console.error(`[KOReader] Cannot build upload payload for "${e.name}": failed to compute partial MD5`),null;r.document=a,this.ConfigService.setObjectConfig(e.key,r,"koreaderBooks")}return n?{document:r.document,percentage:i,progress:n,device:be,device_id:t,timestamp:a.timestamp||parseInt(Date.now()/1e3+"")}:(console.error(`[KOReader] Cannot build upload payload for "${e.name}": no xpath/progress recorded (localRecord.xpath is empty)`),null)})),this.resolveDeviceId=()=>m(this,void 0,void 0,(function*(){try{return(yield this.TokenService.getFingerprint())||"koodo-reader"}catch(e){return console.error("[KOReader] Failed to get device fingerprint, using fallback ID:",e),"koodo-reader"}})),this.verifyAndBuildKOReaderSyncConfig=e=>m(this,void 0,void 0,(function*(){const a={serverUrl:Ee(e.serverUrl),username:(e.username||"").trim(),passwordHash:(e.password||"").trim()?s.MD5((e.password||"").trim()).toString():(e.passwordHash||"").trim()};if(!a.serverUrl||!a.username||!a.passwordHash)throw new Error("Please fill in all fields");try{return yield this.authUser(a),a}catch(e){console.error(`[KOReader] Auth failed for user "${a.username}" at ${a.serverUrl}, attempting to create user:`,e);try{return yield this.createUser(a),yield this.authUser(a),a}catch(o){if((t=o)instanceof Se&&(2002===t.code||(t.message||"").toLowerCase().includes("already exists")))throw console.error(`[KOReader] User "${a.username}" already exists but auth failed. Original auth error:`,e),e;throw console.error(`[KOReader] Failed to create user "${a.username}":`,o),o}}var t})),this.syncKOReaderProgress=e=>m(this,void 0,void 0,(function*(){const a=this.getKOReaderSyncConfig();if(!a)throw new Error("Please configure the KOReader sync server first");yield this.authUser(a);const t=yield this.resolveDeviceId(),o=(yield this.DatabaseService.getAllRecords("books"))||[],i={checkedBooks:0,matchedBooks:0,pulledBooks:0,pushedBooks:0,skippedBooks:0};for(const n of o)try{i.checkedBooks++;const o=this.getLocalRecordLocation(n.key);if(!o||!o.xpath){console.error(`[KOReader] Skipping "${n.name}": no local reading progress (xpath) found`),i.skippedBooks++;continue}const r=this.ConfigService.getObjectConfig(n.key,"koreaderBooks",{});if(!r.document){let a=yield e(n);if(!a){console.error(`[KOReader] Skipping "${n.name}": failed to compute partial MD5 for document ID`),i.skippedBooks++;continue}r.document=a,this.ConfigService.setObjectConfig(n.key,r,"koreaderBooks")}let l=r.document;const s=yield this.getBookProgress(a,l),d=(null==s?void 0:s.timestamp)||0,c=o.timestamp||0;if(s){if(i.matchedBooks++,d>c)this.persistKOReaderMetadata(n.key,o,s),i.pulledBooks++;else{if(!(d{if("number"!=typeof e){const[a,t]=e.split("-");return{styleType:a,color:t}}if(e>=0&&e-1,t=parseInt(xe[e].split("-")[1]);return{styleType:a?"background":"underline",color:a?Ie[t]:Fe[t]}}return{styleType:"background",color:"#FEF3CD"}},this.formatHighlightValue=e=>`${e.styleType}-${e.color}`,this.getNoteHighlightString=()=>this.ConfigService.getReaderConfig(Me)||"background-#FEF3CD",this.getNoteHighlightValue=()=>{const e=this.getNoteHighlightString();if(!e)return Ue;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveNoteHighlightValue=e=>{this.ConfigService.setReaderConfig(Me,`${e.styleType}-${e.color}`)},this.getTtsHighlightString=()=>this.ConfigService.getReaderConfig(_e)||Re,this.getTtsHighlightValue=()=>{const e=this.getTtsHighlightString();if(!e)return Oe;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveTtsHighlightValue=e=>{this.ConfigService.setReaderConfig(_e,`${e.styleType}-${e.color}`)},this.getSearchHighlightString=()=>this.ConfigService.getReaderConfig($e)||Re,this.getSearchHighlightValue=()=>{const e=this.ConfigService.getReaderConfig($e);if(!e)return Oe;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveSearchHighlightValue=e=>{this.ConfigService.setReaderConfig($e,`${e.styleType}-${e.color}`)},this.buildHighlightStyleForType=(e,a,t)=>{let o="background",i="#FEF3CD";if("number"==typeof e){if(e>=0&&e-1,t=parseInt(xe[e].split("-")[1]);o=a?"background":"underline",i=a?Ie[t]:Fe[t]}}else o=e.split("-")[0],i=e.split("-")[1];const n="background"===o?((e,a)=>{const t=e.replace("#",""),o=3===t.length?t.split("").map((e=>e+e)).join(""):t;return 6!==o.length?e:`rgba(${parseInt(o.slice(0,2),16)}, ${parseInt(o.slice(2,4),16)}, ${parseInt(o.slice(4,6),16)}, ${a})`})(i,.8):i;switch(o){case"background":return a?`background: ${n}; mix-blend-mode: multiply;`:`background: ${n};`;case"underline":return a?t?`border-right: 2px solid ${n};`:`border-bottom: 2px solid ${n};`:`text-decoration: underline; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return a?`background: linear-gradient(transparent calc(50% - 1px), ${n} calc(50% - 1px), ${n} calc(50% + 1px), transparent calc(50% + 1px));`:t?`background: linear-gradient(to right, transparent calc(50% - 1px), ${n} calc(50% - 1px), ${n} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const e=i.replace("#","%23");if(a){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${e}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(t){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${e}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${n};`}},this.buildHighlightPreviewStyle=(e,a)=>{switch(e){case"background":default:return{background:a};case"underline":return{textDecoration:"underline",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"};case"strikethrough":return{textDecoration:"line-through",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"};case"wavy":return{textDecorationLine:"underline",textDecorationStyle:"wavy",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"}}},this.convertNumberToHighlightValue=e=>this.getHighlightValue(e),this.buildTtsHighlightStyle=(e,a)=>this.buildHighlightStyleForType(this.getTtsHighlightString(),e,a),this.buildTtsHighlightPreviewStyle=(e,a)=>this.buildHighlightPreviewStyle(e,a),this.buildSearchHighlightStyle=(e,a)=>this.buildHighlightStyleForType(this.getSearchHighlightString(),e,a),this.buildSearchHighlightPreviewStyle=(e,a)=>this.buildHighlightPreviewStyle(e,a),this.ConfigService=e}}const ze=(De=class{static getItem(e){return localStorage.getItem(e)}static setItem(e,a){localStorage.setItem(e,a)}static removeItem(e){localStorage.removeItem(e)}},Le="browser",class extends De{static getReaderConfig(e){return w.includes(e)&&"undefined"!=typeof window&&window.currentBookKey&&this.getAllListConfig("seperateStyleBooks").includes(window.currentBookKey)?this.getObjectConfig(window.currentBookKey,"seperateStyleConfig",{})[e]:JSON.parse(this.getItem("readerConfig")||"{}")[e]}static setReaderConfig(e,a,t=!0){if(w.includes(e)&&"undefined"!=typeof window&&window.currentBookKey&&this.getAllListConfig("seperateStyleBooks").includes(window.currentBookKey)){let o=this.getObjectConfig(window.currentBookKey,"seperateStyleConfig",{});return o[e]=a,void this.setObjectConfig(window.currentBookKey,o,"seperateStyleConfig",t)}let o=JSON.parse(this.getItem("readerConfig")||"{}");o[e]=a,this.setItem("readerConfig",JSON.stringify(o)),t&&this.setSyncRecord({type:"config",catergory:"readerConfig",name:Le,key:e},{operation:"update",time:Date.now()})}static getAllListConfig(e){return("{}"!==this.getItem(e)&&this.getItem(e)?JSON.parse(this.getItem(e)||""):[])||[]}static deleteListConfig(e,a){let t=this.getAllListConfig(a);const o=t.indexOf(e);o>-1&&t.splice(o,1),this.setAllListConfig(t,a)}static setListConfig(e,a){let t=this.getAllListConfig(a);const o=t.indexOf(e);o>-1?(t.splice(o,1),t.unshift(e)):t.unshift(e),this.setAllListConfig(t,a)}static setAllListConfig(e,a,t=!0){this.setItem(a,JSON.stringify(e)),t&&this.setSyncRecord({type:"config",catergory:"listConfig",name:"general",key:a},{operation:"update",time:Date.now()})}static setObjectConfig(e,a,t,o=!0){let i=this.getAllObjectConfig(t);i[e]=a,o&&this.setSyncRecord({type:"config",catergory:"objectConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllObjectConfig(i,t)}static getObjectConfig(e,a,t){return this.getAllObjectConfig(a)[e]||t}static getAllObjectConfig(e){let a=this.getItem(e);return JSON.parse(a)||{}}static setAllObjectConfig(e,a){this.setItem(a,JSON.stringify(e))}static deleteObjectConfig(e,a){let t=this.getAllObjectConfig(a);delete t[e],this.setSyncRecord({type:"config",catergory:"objectConfig",name:a,key:e},{operation:"delete",time:Date.now()}),this.setAllObjectConfig(t,a)}static getAllMapConfig(e){let a=this.getItem(e);return JSON.parse(a)||{}}static getMapConfig(e,a){return this.getAllMapConfig(a)[e]||[]}static setAllMapConfig(e,a){this.setItem(a,JSON.stringify(e))}static setMapConfig(e,a,t){let o=this.getAllMapConfig(t);void 0===o[e]&&(o[e]=[]),a&&-1===o[e].indexOf(a)&&o[e].unshift(a),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,t)}static setOneMapConfig(e,a,t,o=!0){let i=this.getAllMapConfig(t);i[e]=a,o&&this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(i,t)}static deleteFromMapConfig(e,a,t){let o=this.getAllMapConfig(t),i=o[e].indexOf(a);o[e].splice(i,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,t)}static deleteFromAllMapConfig(e,a){let t=this.getAllMapConfig(a);Object.keys(t).forEach((o=>{let i=t[o].indexOf(e);i>-1&&(t[o].splice(i,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:a,key:o},{operation:"update",time:Date.now()}))})),this.setAllMapConfig(t,a)}static deleteMapConfig(e,a){let t=this.getAllMapConfig(a);delete t[e],this.setSyncRecord({type:"config",catergory:"mapConfig",name:a,key:e},{operation:"delete",time:Date.now()}),this.setAllMapConfig(t,a)}static getFromAllMapConfig(e,a){let t=this.getAllMapConfig(a),o=[];for(let a in t)t[a]&&t[a].indexOf(e)>-1&&o.push(a);return o}static getSyncRecord(e){return JSON.parse(this.getItem("syncRecord")||"{}")[e.type+"."+e.catergory+"."+e.name+"."+e.key]||{operation:"",time:0}}static getAllSyncRecord(){return JSON.parse(this.getItem("syncRecord")||"{}")}static setSyncRecord(e,a){const t=e.type+"."+e.catergory+"."+e.name+"."+e.key;let o=JSON.parse(this.getItem("syncRecord")||"{}");o[t]=a,this.setItem("syncRecord",JSON.stringify(o))}static setAllSyncRecord(e){this.setItem("syncRecord",JSON.stringify(e))}});var De,Le;class Pe{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("notionSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Notion] notionSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Notion] Failed to read notionSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableNotionSync")}resolveDatabaseId(e,a){return m(this,void 0,void 0,(function*(){const t=yield fetch(`https://api.notion.com/v1/blocks/${a}/children`,{method:"GET",headers:{Authorization:`Bearer ${e}`,"Notion-Version":"2022-06-28"}});if(!t.ok){const e=yield t.json().catch((()=>null));throw console.error(`[Notion] resolveDatabaseId failed for page ${a}: HTTP ${t.status} ${t.statusText}`,JSON.stringify(e)),new Error(`Notion resolve database error: ${t.status} ${t.statusText}`)}const o=yield t.json(),i=(o.results||[]).find((e=>"child_database"===e.type));if(!i)throw console.error(`[Notion] No child_database block found under page ${a}. Available block types:`,JSON.stringify((o.results||[]).map((e=>e.type)))),new Error(`No child database found in page ${a}. Please provide a Database ID directly.`);return i.id}))}findOrCreatePage(e,a,t){return m(this,void 0,void 0,(function*(){const o=`${t}`,i=yield fetch(`https://api.notion.com/v1/databases/${a}/query`,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({filter:{property:"title",title:{equals:o}}})});if(!i.ok){const o=yield i.json().catch((()=>({})));if(400===i.status&&"validation_error"===(null==o?void 0:o.code)&&"string"==typeof(null==o?void 0:o.message)&&o.message.includes("is a page, not a database")){console.error(`[Notion] Provided databaseId "${a}" is a page, not a database. Resolving child database...`);const o=yield this.resolveDatabaseId(e,a);return this.findOrCreatePage(e,o,t)}throw console.error(`[Notion] Database query failed for databaseId "${a}" (book: "${t}"): HTTP ${i.status} ${i.statusText}`,JSON.stringify(o)),new Error(`Notion API error: ${i.status} ${i.statusText}`)}const n=yield i.json();if(n.results&&n.results.length>0)return n.results[0].id;const r=yield fetch("https://api.notion.com/v1/pages",{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({parent:{database_id:a},properties:{title:{title:[{text:{content:o}}]}}})});if(!r.ok){const e=yield r.json().catch((()=>null));throw console.error(`[Notion] Failed to create page for book "${t}" in database "${a}": HTTP ${r.status} ${r.statusText}`,JSON.stringify(e)),new Error(`Notion create page error: ${r.status} ${r.statusText}`)}return(yield r.json()).id}))}appendBlocks(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=!t.notes||0===t.notes.length,n=[];n.push({object:"block",type:"divider",divider:{}}),o&&n.push({object:"block",type:"heading_3",heading_3:{rich_text:[{type:"text",text:{content:o}}]}}),n.push({object:"block",type:"quote",quote:{rich_text:[{type:"text",text:{content:t.text||""}}]}}),!i&&t.notes&&n.push({object:"block",type:"paragraph",paragraph:{rich_text:[{type:"text",text:{content:`📝 ${t.notes}`}}]}});const r=`${t.date.year}-${String(t.date.month).padStart(2,"0")}-${String(t.date.day).padStart(2,"0")}`;n.push({object:"block",type:"paragraph",paragraph:{rich_text:[{type:"text",text:{content:`Added on ${r}`},annotations:{italic:!0,color:"gray"}}]}});const l=yield fetch(`https://api.notion.com/v1/blocks/${a}/children`,{method:"PATCH",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({children:n})});if(!l.ok){const e=yield l.json().catch((()=>null));throw console.error(`[Notion] Failed to append blocks to page ${a}: HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),new Error(`Notion append blocks error: ${l.status} ${l.statusText}`)}}))}syncNote(e,a){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const t=this.getConfig();if(!t)return!1;try{const o=yield this.findOrCreatePage(t.token,t.databaseId,a);return yield this.appendBlocks(t.token,o,e,e.chapter||""),!0}catch(e){return console.error(`[Notion] Sync failed for book "${a}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class je{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("yuqueSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Yuque] yuqueSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Yuque] Failed to read yuqueSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableYuqueSync")}generateDocSlug(e){return m(this,void 0,void 0,(function*(){const a=(e||"").trim()||"untitled",t=a.toLowerCase().replace(/[^a-z0-9_.-]/g,"-").replace(/[-_.]{2,}/g,"-").replace(/^[-_.]+|[-_.]+$/g,"")||"book",o=(yield y(a)).slice(0,16),i=t,n=190-o.length-1;return`${i.substring(0,n).replace(/^[-_.]+|[-_.]+$/g,"")||"book"}-${o}`}))}findOrCreateDoc(e,a,t){return m(this,void 0,void 0,(function*(){const o=`${t}`,i=yield this.generateDocSlug(t);try{const t=yield fetch(`${je.API_BASE}/repos/${a}/docs/${i}`,{method:"GET",headers:{"X-Auth-Token":e,"Content-Type":"application/json"}});if(t.ok){const e=yield t.json();return{id:e.data.id,slug:e.data.slug,body:e.data.body||""}}if(404!==t.status){const e=yield t.json().catch((()=>null));console.error(`[Yuque] Unexpected error fetching doc "${i}" in repo "${a}": HTTP ${t.status} ${t.statusText}`,JSON.stringify(e))}}catch(e){console.error(`[Yuque] Network error fetching doc "${i}" in repo "${a}":`,JSON.stringify(e))}const n=yield fetch(`${je.API_BASE}/repos/${a}/docs`,{method:"POST",headers:{"X-Auth-Token":e,"Content-Type":"application/json"},body:JSON.stringify({title:o,slug:i,body:`# ${o}\n\n`,format:"markdown"})});if(!n.ok){const e=yield n.json().catch((()=>null));throw console.error(`[Yuque] Failed to create doc "${o}" in repo "${a}": HTTP ${n.status} ${n.statusText}`,JSON.stringify(e)),new Error(`Yuque create doc error: ${n.status} ${n.statusText}`)}const r=yield n.json();return{id:r.data.id,slug:r.data.slug,body:r.data.body||""}}))}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="\n---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}updateDoc(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${je.API_BASE}/repos/${a}/docs/${t}`,{method:"PUT",headers:{"X-Auth-Token":e,"Content-Type":"application/json"},body:JSON.stringify({body:o,format:"markdown"})});if(!i.ok){const e=yield i.json().catch((()=>null));throw console.error(`[Yuque] Failed to update doc ${t} in repo "${a}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),new Error(`Yuque update doc error: ${i.status} ${i.statusText}`)}}))}syncNote(e,a){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const t=this.getConfig();if(!t)return!1;try{const o=yield this.findOrCreateDoc(t.token,t.namespace,a),i=this.formatNoteMarkdown(e),n=o.body+i;return yield this.updateDoc(t.token,t.namespace,o.id,n),!0}catch(e){return console.error(`[Yuque] Sync failed for book "${a}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}je.API_BASE="https://www.yuque.com/api/v2";class Ke{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("readwiseSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Readwise] readwiseSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Readwise] Failed to read readwiseSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableReadwiseSync")}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=`${a}`,n=!e.notes||0===e.notes.length,r={text:e.text||"",title:i,author:t||"Unknown",source_type:"koodo-reader",category:"books",highlighted_at:`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`};if(!n&&e.notes&&(r.note=e.notes),e.chapter){const a=parseInt(e.chapter,10);isNaN(a)||(r.location_type="order",r.location=a)}try{const e=yield fetch(`${Ke.API_BASE}/highlights/`,{method:"POST",headers:{Authorization:`Token ${o.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({highlights:[r]})});if(!e.ok){const a=yield e.json().catch((()=>null));throw console.error(`[Readwise] Failed to sync highlight for book "${i}": HTTP ${e.status} ${e.statusText}`,JSON.stringify(a)),new Error(`Readwise API error: ${e.status} ${e.statusText}`)}return!0}catch(a){return console.error(`[Readwise] Sync failed for book "${i}" (text: "${(e.text||"").substring(0,50)}..."):`,JSON.stringify(a instanceof Error?a.message:a)),!1}}))}}Ke.API_BASE="https://readwise.io/api/v2";class He{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("imaSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[IMA] imaSyncConfig is empty or not set"),null):e}catch(e){return console.error("[IMA] Failed to read imaSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableImaSync")}getHeaders(e){return{"Content-Type":"application/json","ima-openapi-clientid":e.clientId,"ima-openapi-apikey":e.apiKey}}formatNoteMarkdown(e,a,t){const o=!e.notes||0===e.notes.length,i=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let n="\n---\n\n";return e.chapter&&(n+=`### ${e.chapter}\n\n`),n+=`> ${e.text||""}\n\n`,!o&&e.notes&&(n+=`**Note:** ${e.notes}\n\n`),n+=`*${i}*\n`,n}findNoteByTitle(e,a){var t,o,i,n;return m(this,void 0,void 0,(function*(){try{const r=JSON.stringify({search_type:0,query_info:{title:a},start:0,end:20}),l=yield fetch(`${He.API_BASE}/search_note`,{method:"POST",headers:this.getHeaders(e),body:r});if(!l.ok){const e=yield l.json().catch((()=>null));return console.error(`[IMA] search_note failed for title "${a}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),null}const s=yield l.json();if(0!==s.code)return console.error(`[IMA] search_note returned error code ${s.code} for title "${a}":`,JSON.stringify(null!==(t=s.msg)&&void 0!==t?t:s)),null;const d=((null===(o=s.data)||void 0===o?void 0:o.search_note_infos)||[]).find((e=>{var t;return a.includes(null===(t=e.note_book_info)||void 0===t?void 0:t.title.replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu,""))}));return null!==(n=null===(i=null==d?void 0:d.note_book_info)||void 0===i?void 0:i.note_id)&&void 0!==n?n:null}catch(e){return console.error(`[IMA] Network error in search_note for title "${a}":`,JSON.stringify(e)),null}}))}createNote(e,a,t){var o,i,n;return m(this,void 0,void 0,(function*(){try{const r={content_format:1,content:`# ${a}\n\n${t}`};e.folderId&&(r.folder_id=e.folderId);const l=yield fetch(`${He.API_BASE}/import_doc`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify(r)});if(!l.ok){const e=yield l.json().catch((()=>null));return console.error(`[IMA] import_doc failed for note "${a}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),null}const s=yield l.json();return 0!==s.code?(console.error(`[IMA] import_doc returned error code ${s.code} for note "${a}":`,JSON.stringify(null!==(o=s.msg)&&void 0!==o?o:s)),null):null!==(n=null===(i=s.data)||void 0===i?void 0:i.note_id)&&void 0!==n?n:null}catch(e){return console.error(`[IMA] Network error in import_doc for note "${a}":`,JSON.stringify(e)),null}}))}appendNote(e,a,t){var o;return m(this,void 0,void 0,(function*(){try{const i=yield fetch(`${He.API_BASE}/append_doc`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify({note_id:a,content_format:1,content:t})});if(!i.ok){const e=yield i.json().catch((()=>null));return console.error(`[IMA] append_doc failed for noteId "${a}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),!1}const n=yield i.json();return 0===n.code||(console.error(`[IMA] append_doc returned error code ${n.code} for noteId "${a}":`,JSON.stringify(null!==(o=n.msg)&&void 0!==o?o:n)),!1)}catch(e){return console.error(`[IMA] Network error in append_doc for noteId "${a}":`,JSON.stringify(e)),!1}}))}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=this.formatNoteMarkdown(e,a,t);let n=yield this.findNoteByTitle(o,a);if(n){const e=yield this.appendNote(o,n,i);return e||console.error(`[IMA] Failed to append to existing note "${a}" (noteId: ${n})`),e}return n=yield this.createNote(o,a,i),n||console.error(`[IMA] Failed to create note for book "${a}"`),null!==n}))}}He.API_BASE="https://ima.qq.com/openapi/note/v1";class Je{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("siyuanSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[SiYuan] siyuanSyncConfig is empty or not set"),null):e}catch(e){return console.error("[SiYuan] Failed to read siyuanSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableSiYuanSync")}getHeaders(e){return{"Content-Type":"application/json",Authorization:`Token ${e}`}}findOrCreateNotebook(e,a){var t,o;return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/notebook/lsNotebooks`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({})});if(!i.ok){const a=yield i.json().catch((()=>null));throw console.error(`[SiYuan] lsNotebooks failed at ${e}: HTTP ${i.status} ${i.statusText}`,JSON.stringify(a)),new Error(`SiYuan list notebooks failed: ${i.status} ${i.statusText}`)}const n=yield i.json();if(0!==n.code)throw console.error(`[SiYuan] lsNotebooks returned error code ${n.code}:`,JSON.stringify(n.msg)),new Error(`SiYuan list notebooks error: ${n.msg}`);const r=(null!==(o=null===(t=n.data)||void 0===t?void 0:t.notebooks)&&void 0!==o?o:[]).find((e=>"Koodo Reader"===e.name));if(r)return r.id;const l=yield fetch(`${e}/api/notebook/createNotebook`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({name:"Koodo Reader"})});if(!l.ok){const a=yield l.json().catch((()=>null));throw console.error(`[SiYuan] createNotebook failed at ${e}: HTTP ${l.status} ${l.statusText}`,JSON.stringify(a)),new Error(`SiYuan create notebook failed: ${l.status} ${l.statusText}`)}const s=yield l.json();if(0!==s.code)throw console.error(`[SiYuan] createNotebook returned error code ${s.code}:`,JSON.stringify(s.msg)),new Error(`SiYuan create notebook error: ${s.msg}`);return s.data.notebook.id}))}findOrCreateDoc(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/query/sql`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({stmt:`SELECT id FROM blocks WHERE type='d' AND hpath='${o.replace(/'/g,"''")}' LIMIT 1`})});if(i.ok){const e=yield i.json();if(0!==e.code)console.error(`[SiYuan] SQL query for doc "${o}" returned error code ${e.code}:`,JSON.stringify(e.msg));else if(e.data&&e.data.length>0)return e.data[0].id}else{const e=yield i.json().catch((()=>null));console.error(`[SiYuan] SQL query for doc "${o}" failed: HTTP ${i.status} ${i.statusText}`,JSON.stringify(e))}const r=n?`**Author:** ${n}\n`:"",l=yield fetch(`${e}/api/filetree/createDocWithMd`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({notebook:t,path:o,markdown:r})});if(!l.ok){const e=yield l.json().catch((()=>null));throw console.error(`[SiYuan] createDocWithMd failed for "${o}" in notebook "${t}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),new Error(`SiYuan create doc failed: ${l.status} ${l.statusText}`)}const s=yield l.json();if(0!==s.code)throw console.error(`[SiYuan] createDocWithMd returned error code ${s.code} for "${o}":`,JSON.stringify(s.msg)),new Error(`SiYuan create doc error: ${s.msg}`);return s.data}))}appendMarkdownToDoc(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/block/appendBlock`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({data:o,dataType:"markdown",parentID:t})});if(!i.ok){const e=yield i.json().catch((()=>null));throw console.error(`[SiYuan] appendBlock failed for docId "${t}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),new Error(`SiYuan append block failed: ${i.status} ${i.statusText}`)}const n=yield i.json();if(0!==n.code)throw console.error(`[SiYuan] appendBlock returned error code ${n.code} for docId "${t}":`,JSON.stringify(n.msg)),new Error(`SiYuan append block error: ${n.msg}`)}))}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}sanitizePathComponent(e){return e.replace(/[\\/:*?"<>|]/g,"_").trim()}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const{serverUrl:i,token:n}=o;if(!i||!n)return console.error("[SiYuan] Sync skipped: config is missing serverUrl or token",JSON.stringify({hasServerUrl:!!i,hasToken:!!n})),!1;try{const o=yield this.findOrCreateNotebook(i,n),r=`/${this.sanitizePathComponent(a)}`,l=yield this.findOrCreateDoc(i,n,o,r,a,t),s=this.formatNoteMarkdown(e);return yield this.appendMarkdownToDoc(i,n,l,s),!0}catch(e){return console.error(`[SiYuan] Sync failed for book "${a}" at ${o.serverUrl}:`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class We{constructor(e,a){this.databaseService=e,this.notionSync=new Pe(a),this.yuqueSync=new je(a),this.readwiseSync=new Ke(a),this.imaSync=new He(a),this.siyuanSync=new Je(a)}getExtraServices(){return[]}getEnabledServices(){const e=[];return this.notionSync.isEnabled()&&e.push({name:"Notion",sync:this.notionSync.syncNote.bind(this.notionSync)}),this.yuqueSync.isEnabled()&&e.push({name:"Yuque",sync:this.yuqueSync.syncNote.bind(this.yuqueSync)}),this.readwiseSync.isEnabled()&&e.push({name:"Readwise",sync:this.readwiseSync.syncNote.bind(this.readwiseSync)}),this.imaSync.isEnabled()&&e.push({name:"IMA",sync:this.imaSync.syncNote.bind(this.imaSync)}),this.siyuanSync.isEnabled()&&e.push({name:"SiYuan",sync:this.siyuanSync.syncNote.bind(this.siyuanSync)}),[...e,...this.getExtraServices()]}syncNote(e,a){return m(this,void 0,void 0,(function*(){const t=this.getEnabledServices();if(0===t.length)return;let o="Unknown Book",i="";if(a||e.bookKey)try{const t=yield this.databaseService.getRecord(a||e.bookKey,"books");t&&t.name&&(o=t.name),t&&t.author&&(i=t.author)}catch(t){console.error(`[NoteSync] Failed to resolve book info for key: ${a||e.bookKey}`,JSON.stringify(t))}const n=(yield Promise.allSettled(t.map((a=>m(this,void 0,void 0,(function*(){var t,n,r,l;try{const r=yield a.sync(e,o,i);return r||console.error(`[NoteSync] ${a.name} sync returned false for book "${o}" (noteId: ${null!==(n=null!==(t=e.noteKey)&&void 0!==t?t:e.key)&&void 0!==n?n:"unknown"})`),{name:a.name,success:r}}catch(t){return console.error(`[NoteSync] ${a.name} sync threw an error for book "${o}" (noteId: ${null!==(l=null!==(r=e.noteKey)&&void 0!==r?r:e.key)&&void 0!==l?l:"unknown"}):`,JSON.stringify(t)),{name:a.name,success:!1}}})))))).filter((e=>"rejected"===e.status||"fulfilled"===e.status&&!e.value.success)).map((e=>"fulfilled"===e.status?e.value.name:"Unknown"));n.length>0&&console.error(`[NoteSync] Sync failed for services: ${n.join(", ")} | book: "${o}"`)}))}}class qe{constructor(e,a,t){this.configService=e,this.fs=a,this.path=t}getConfig(){try{const e=this.configService.getObjectConfig("markdownSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Markdown] markdownSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Markdown] Failed to read markdownSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableMarkdownSync")}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="\n---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}sanitizeFileName(e){return e.replace(/[\\/:*?"<>|]/g,"_").trim()}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=o.folder;if(!i)return console.error("[Markdown] Sync skipped: markdownSyncConfig.folder is not set"),!1;const n=this.fs,r=this.path;try{const o=this.sanitizeFileName(a),l=r.join(i,`${o}.md`);if(!n.existsSync(l)){const e=`# ${a}\n`,o=t?`**Author:** ${t}\n\n`:"\n";try{n.writeFileSync(l,e+o,"utf-8")}catch(e){return console.error(`[Markdown] Failed to create file "${l}" for book "${a}":`,JSON.stringify(e)),!1}}const s=this.formatNoteMarkdown(e);try{n.appendFileSync(l,s,"utf-8")}catch(e){return console.error(`[Markdown] Failed to append to file "${l}" for book "${a}":`,JSON.stringify(e)),!1}return!0}catch(e){return console.error(`[Markdown] Sync failed for book "${a}" in folder "${i}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class Ge extends We{constructor(e,a,t,o){super(e,a),this.markdownSync=new qe(a,t,o)}getExtraServices(){return this.markdownSync.isEnabled()?[{name:"Markdown",sync:this.markdownSync.syncNote.bind(this.markdownSync)}]:[]}}class Qe{constructor(a){this.syncWordToEudic=(a,t)=>m(this,void 0,void 0,(function*(){var o,i,n,r,l,s,d,c,u,m;if("yes"===this.configService.getReaderConfig("isEnableEudicSync"))try{let c;try{c=this.configService.getObjectConfig("eudicSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[Eudic] Failed to read eudicSyncConfig:",JSON.stringify(e))}if(!c||!c.accessToken)return void console.error("[Eudic] Sync skipped: config is missing or accessToken is not set",JSON.stringify({hasConfig:!!c}));const u=c.language||"en",m={Authorization:`NIS ${c.accessToken}`,"Content-Type":"application/json","User-Agent":"Mozilla/5.0"};let p="0";const h=(c.categoryName||"").trim();if(h)if(void 0!==c.categoryId)p=c.categoryId;else try{const a=(null===(o=(yield e.get(`https://api.frdic.com/api/open/v1/studylist/category?language=${u}`,{headers:m})).data)||void 0===o?void 0:o.data)||[],t=a.find((e=>e.name===h));t?p=t.id:console.error(`[Eudic] Category "${h}" not found among available categories:`,JSON.stringify(a.map((e=>e.name))));const i=Object.assign(Object.assign({},c),{categoryId:p});this.configService.setObjectConfig("eudicSyncConfig",i,"thirdpartyToken")}catch(e){console.error("[Eudic] Failed to fetch category list:",null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.status,JSON.stringify(null!==(r=null===(n=null==e?void 0:e.response)||void 0===n?void 0:n.data)&&void 0!==r?r:e))}try{yield e.post("https://api.frdic.com/api/open/v1/studylist/word",{language:u,word:a,context_line:t||"",category_ids:[p]},{headers:m})}catch(e){throw console.error(`[Eudic] Failed to add word "${a}" to study list (category: ${p}):`,null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,JSON.stringify(null!==(d=null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.data)&&void 0!==d?d:e)),e}}catch(e){console.error("[Eudic] Sync error for word:",a,null===(c=null==e?void 0:e.response)||void 0===c?void 0:c.status,JSON.stringify(null!==(m=null===(u=null==e?void 0:e.response)||void 0===u?void 0:u.data)&&void 0!==m?m:e))}})),this.syncWordToAnki=(a,t,o,i,n="")=>m(this,void 0,void 0,(function*(){var r,l,s,d,c,u,m,p,h,g;if("yes"===this.configService.getReaderConfig("isEnableAnkiSync"))try{let h;try{h=this.configService.getObjectConfig("ankiSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[Anki] Failed to read ankiSyncConfig:",JSON.stringify(e))}if(!h||!h.deckName)return void console.error("[Anki] Sync skipped: config is missing or deckName is not set",JSON.stringify({hasConfig:!!h}));const g=h.host||"127.0.0.1",f=`http://${g}:${h.port||"8765"}`,y=h.deckName,N="Koodo Reader Word",v=(a,t={})=>{const o={action:a,version:6,params:t};return h.apiKey&&(o.key=h.apiKey),e.post(f,o)};if(!h.modelName)try{const e=yield v("modelNames");if(!((null===(r=e.data)||void 0===r?void 0:r.result)||[]).includes(N))try{yield v("createModel",{modelName:N,inOrderFields:["Word","Sentence","Book","Chapter","Definition"],cardTemplates:[{Name:"Card 1",Front:"{{Word}}

{{Sentence}}

{{Book}}
{{Chapter}}",Back:"{{Definition}}"}]})}catch(e){throw console.error(`[Anki] Failed to create model "${N}":`,JSON.stringify(null!==(s=null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.data)&&void 0!==s?s:e)),e}this.configService.setObjectConfig("ankiSyncConfig",Object.assign(Object.assign({},h),{modelName:N}),"thirdpartyToken")}catch(e){throw console.error(`[Anki] Failed to fetch model names from ${f}:`,JSON.stringify(null!==(c=null===(d=null==e?void 0:e.response)||void 0===d?void 0:d.data)&&void 0!==c?c:e)),e}try{const e=yield v("addNote",{note:{deckName:y,modelName:N,fields:{Word:a,Sentence:t||"",Book:o||"",Chapter:i||"",Definition:n||""},options:{allowDuplicate:!1},tags:[]}});(null===(u=e.data)||void 0===u?void 0:u.error)&&console.error(`[Anki] addNote returned an error for word "${a}" in deck "${y}":`,JSON.stringify(e.data.error))}catch(e){throw console.error(`[Anki] Failed to add note for word "${a}" to deck "${y}" at ${f}:`,JSON.stringify(null!==(p=null===(m=null==e?void 0:e.response)||void 0===m?void 0:m.data)&&void 0!==p?p:e)),e}}catch(e){console.error("[Anki] Sync error for word:",a,JSON.stringify(null!==(g=null===(h=null==e?void 0:e.response)||void 0===h?void 0:h.data)&&void 0!==g?g:e))}})),this.syncWordToMaiMemo=a=>m(this,void 0,void 0,(function*(){var t,o,i,n,r,l,s,d,c,u,m,p,h,g,f,y,N,v,b,k;if("yes"===this.configService.getReaderConfig("isEnableMaiMemoSync"))try{let v;try{v=this.configService.getObjectConfig("maimemoSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[MaiMemo] Failed to read maimemoSyncConfig:",JSON.stringify(e))}if(!v||!v.accessToken||!v.notepadName)return void console.error("[MaiMemo] Sync skipped: config is missing accessToken or notepadName",JSON.stringify({hasConfig:!!v}));const b=v.accessToken,k=v.notepadName.trim(),S={Authorization:`Bearer ${b}`,"Content-Type":"application/json",Accept:"application/json"};let E=v.notepadId||"";if(!E)try{const l=yield e.get("https://open.maimemo.com/open/api/v1/memo/notepads",{headers:S}),s=((null===(o=null===(t=l.data)||void 0===t?void 0:t.data)||void 0===o?void 0:o.notepads)||[]).find((e=>"PUBLISHED"===e.status&&e.title===k));if(s)E=s.id;else{if(E=null===(r=null===(n=null===(i=(yield e.post("https://open.maimemo.com/open/api/v1/memo/notepads",{notepad:{status:"PUBLISHED",content:a,title:k,brief:k,tags:[]}},{headers:S})).data)||void 0===i?void 0:i.data)||void 0===n?void 0:n.notepad)||void 0===r?void 0:r.id,!E)return void console.error("[MaiMemo] Created notepad but no id returned")}this.configService.setObjectConfig("maimemoSyncConfig",Object.assign(Object.assign({},v),{notepadId:E}),"thirdpartyToken")}catch(e){return void console.error("[MaiMemo] Failed to resolve notepadId:",null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,JSON.stringify(null!==(d=null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.data)&&void 0!==d?d:e))}try{let t="";try{t=(null===(m=null===(u=null===(c=(yield e.get(`https://open.maimemo.com/open/api/v1/memo/notepads/${E}`,{headers:S})).data)||void 0===c?void 0:c.data)||void 0===u?void 0:u.notepad)||void 0===m?void 0:m.content)||""}catch(e){return void console.error("[MaiMemo] Failed to fetch notepad content:",null===(p=null==e?void 0:e.response)||void 0===p?void 0:p.status,JSON.stringify(null!==(g=null===(h=null==e?void 0:e.response)||void 0===h?void 0:h.data)&&void 0!==g?g:e))}const o=t.split("\n").map((e=>e.trim())).filter((e=>e.length>0));if(o.includes(a))return;o.push(a),yield e.post(`https://open.maimemo.com/open/api/v1/memo/notepads/${E}`,{id:E,notepad:{status:"PUBLISHED",content:o.join("\n"),title:k,brief:k,tags:[]}},{headers:S})}catch(e){throw console.error(`[MaiMemo] Failed to add word "${a}" to notepad "${k}" (${E}):`,null===(f=null==e?void 0:e.response)||void 0===f?void 0:f.status,JSON.stringify(null!==(N=null===(y=null==e?void 0:e.response)||void 0===y?void 0:y.data)&&void 0!==N?N:e)),e}}catch(e){console.error("[MaiMemo] Sync error for word:",a,null===(v=null==e?void 0:e.response)||void 0===v?void 0:v.status,JSON.stringify(null!==(k=null===(b=null==e?void 0:e.response)||void 0===b?void 0:b.data)&&void 0!==k?k:e))}})),this.configService=a}}class Ye extends Qe{}export{S as CommonTool,ze as ConfigService,Be as HighlightUtil,Ae as KOReaderUtil,A as KookitConfig,ye as LoginHelper,Ge as NoteSyncManager,he as ReaderRequest,ve as ReadingTimeUtil,ce as SqlStatement,Ne as SyncHelper,oe as SyncUtil,ge as ThirdpartyRequest,fe as UserRequest,Ye as WordSyncManager}; +import e from"axios";import{Storage as a}from"megajs";import{Buffer as t}from"buffer";import{S3Client as o,ListObjectsV2Command as i,DeleteObjectCommand as n,PutObjectCommand as r,GetObjectCommand as l}from"@aws-sdk/client-s3";import s from"crypto-js";import{AuthType as d,createClient as c}from"webdav/dist/web/index.js";import{SSE as u}from"sse.js";function m(e,a,t,o){return new(t||(t=Promise))((function(i,n){function r(e){try{s(o.next(e))}catch(e){n(e)}}function l(e){try{s(o.throw(e))}catch(e){n(e)}}function s(e){var a;e.done?i(e.value):(a=e.value,a instanceof t?a:new t((function(e){e(a)}))).then(r,l)}s((o=o.apply(e,a||[])).next())}))}const p=e=>"json"===e?"application/json":["jpg","jpeg","png","gif","bmp"].includes(e)?"image/"+e:"zip"===e?"application/zip":"epub"===e?"application/epub+zip":"txt"===e?"text/plain":"pdf"===e?"application/pdf":"mobi"===e?"application/x-mobipocket-ebook":"azw3"===e||"azw"===e?"application/vnd.amazon.ebook":"cbz"===e?"application/x-cbz":"cbr"===e?"application/x-cbr":"cbt"===e?"application/x-cbt":"cb7"===e?"application/x-cb7":"fb2"===e?"application/x-fictionbook+xml":"html"===e?"text/html":"css"===e?"text/css":"js"===e?"application/javascript":"xml"===e?"application/xml":"xhtml"===e?"application/xhtml+xml":"opf"===e?"application/oebps-package+xml":"ncx"===e?"application/x-dtbncx+xml":"mp3"===e?"audio/mpeg":"wav"===e?"audio/wav":"ogg"===e?"audio/ogg":"mp4"===e?"video/mp4":"webm"===e?"video/webm":"avi"===e?"video/x-msvideo":"wmv"===e?"video/x-ms-wmv":"flv"===e?"video/x-flv":"m3u8"===e?"application/x-mpegURL":"ts"===e?"video/MP2T":"3gp"===e?"video/3gpp":"3g2"===e?"video/3gpp2":"db"===e?"application/x-sqlite3":void 0,h=["books","notes","bookmarks","plugins","words"],g=e=>{const a=atob(e),t=a.length,o=new Uint8Array(t);for(let e=0;e{let a="";const t=new Uint8Array(e),o=t.byteLength;for(let e=0;ee.toString(16).padStart(2,"0"))).join("")}))}function N(e){const a=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],t=(e,a)=>e>>>a|e<<32-a,o=(e,a,t)=>e&a^~e&t,i=(e,a,t)=>e&a^e&t^a&t,n=e=>t(e,2)^t(e,13)^t(e,22),r=e=>t(e,6)^t(e,11)^t(e,25),l=e=>t(e,7)^t(e,18)^e>>>3,s=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],d=8*e.length,c=(960-(8*e.length+1)%512)%512,u=e.length+Math.ceil((c+1)/8)+8,m=new Uint8Array(u);m.set(e),m[e.length]=128;new DataView(m.buffer,m.byteLength-8).setBigUint64(0,BigInt(d),!1);for(let e=0;e>>10)+c[e-7]+l(c[e-15])+c[e-16]>>>0);let[u,h,g,f,y,N,v,b]=s;for(let e=0;e<64;e++){const t=b+r(y)+o(y,N,v)+a[e]+c[e]>>>0,l=n(u)+i(u,h,g)>>>0;b=v,v=N,N=y,y=f+t>>>0,f=g,g=h,h=u,u=t+l>>>0}s[0]=s[0]+u>>>0,s[1]=s[1]+h>>>0,s[2]=s[2]+g>>>0,s[3]=s[3]+f>>>0,s[4]=s[4]+y>>>0,s[5]=s[5]+N>>>0,s[6]=s[6]+v>>>0,s[7]=s[7]+b>>>0}var p;const h=new ArrayBuffer(32),g=new DataView(h);return s.forEach(((e,a)=>{g.setUint32(4*a,e,!1)})),h}const v={_chars:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",encode(e){if("string"!=typeof e)throw new Error("Input must be a string");let a="",t=0;const o=this._stringToUtf8Bytes(e),i=o.length;for(;t>2,s=(3&e)<<4|n>>4,d=(15&n)<<2|r>>6,c=63&r;a+=this._chars.charAt(l),a+=this._chars.charAt(s),a+=t-2>=i?"=":this._chars.charAt(d),a+=t-1>=i?"=":this._chars.charAt(c)}return a},decode(e){if("string"!=typeof e)throw new Error("Input must be a string");for(e=e.replace(/[^A-Za-z0-9+/]/g,"");e.length%4!=0;)e+="=";const a=[];let t=0;const o=e.length;for(;t>4,s=(15&i)<<4|n>>2,d=(3&n)<<6|r;a.push(l),-1!==n&&a.push(s),-1!==r&&a.push(d)}return this._utf8BytesToString(a)},_stringToUtf8Bytes(e){const a=[];for(let t=0;t>6),a.push(128|63&o);else if(55296==(64512&o)&&t+1>18),a.push(128|e>>12&63),a.push(128|e>>6&63),a.push(128|63&e)}else a.push(239,191,189),t--}else a.push(224|o>>12),a.push(128|o>>6&63),a.push(128|63&o)}return a},_utf8BytesToString(e){let a="",t=0;for(;t65535){const t=e-65536;a+=String.fromCharCode(55296|t>>10),a+=String.fromCharCode(56320|1023&t)}else a+=String.fromCharCode(e)}else a+="�"}else a+="�"}return a},encodeURL(e){return this.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")},decodeURL(e){for(e=e.replace(/-/g,"+").replace(/_/g,"/");e.length%4;)e+="=";return this.decode(e)}},b=e=>{const a=(e,a)=>{const t=(65535&e)+(65535&a);return(e>>16)+(a>>16)+(t>>16)<<16|65535&t},t=(e,t,o,i,n,r)=>{return a((l=a(a(t,e),a(i,r)))<<(s=n)|l>>>32-s,o);var l,s},o=(e,a,o,i,n,r,l)=>t(a&o|~a&i,e,a,n,r,l),i=(e,a,o,i,n,r,l)=>t(a&i|o&~i,e,a,n,r,l),n=(e,a,o,i,n,r,l)=>t(a^o^i,e,a,n,r,l),r=(e,a,o,i,n,r,l)=>t(o^(a|~i),e,a,n,r,l),l=e.length,s=1+(l+8>>6),d=new Array(16*s).fill(0);for(let a=0;a>2]|=e[a]<>2]|=128<{let a="";for(let t=0;t<4;t++)a+=("0"+(e>>8*t&255).toString(16)).slice(-2);return a})).join("")};class k{constructor(e){this.queue=[],this.runningTasks=0,this.totalTasks=0,this.completedTasks=0,this.hasFailedTasks=!1,this.downloadedSize=0,this.maxConcurrency=e}addTask(e){return m(this,void 0,void 0,(function*(){return this.totalTasks++,new Promise(((a,t)=>{if(this.hasFailedTasks)return void a(void 0);const o=()=>m(this,void 0,void 0,(function*(){if(this.hasFailedTasks)return this.completedTasks++,void a(void 0);try{this.runningTasks++;const t=yield e();return this.completedTasks++,a(t),t}catch(e){throw this.completedTasks++,t(e),e}finally{this.runningTasks--,this.runNext()}}));this.runningTasks0;){const e=this.queue.shift();e&&e()}else if(this.queue.length>0&&this.runningTasks"application/json"===e?"json":e.startsWith("image/")?e.split("/")[1]:"application/zip"===e?"zip":"application/epub+zip"===e?"epub":"text/plain"===e?"txt":"application/pdf"===e?"pdf":"application/x-mobipocket-ebook"===e?"mobi":"application/vnd.amazon.ebook"===e?"azw3":"application/x-cbz"===e?"cbz":"application/x-cbr"===e?"cbr":"application/x-cbt"===e?"cbt":"application/x-cb7"===e?"cb7":"application/x-fictionbook+xml"===e?"fb2":"text/html"===e?"html":"text/css"===e?"css":"application/javascript"===e?"js":"application/xml"===e?"xml":"application/xhtml+xml"===e?"xhtml":"application/oebps-package+xml"===e?"opf":"application/x-dtbncx+xml"===e?"ncx":"audio/mpeg"===e?"mp3":"audio/wav"===e?"wav":"audio/ogg"===e?"ogg":"video/mp4"===e?"mp4":"video/webm"===e?"webm":"video/x-msvideo"===e?"avi":"video/x-ms-wmv"===e?"wmv":"video/x-flv"===e?"flv":"application/x-mpegURL"===e?"m3u8":"video/MP2T"===e?"ts":"video/3gpp"===e?"3gp":"video/3gpp2"===e?"3g2":"application/x-sqlite3"===e?"db":"",databaseList:h,configList:["themeColors","readingTime","appVersion","cloudSyncTime","lastSyncTime","recentBooks","koreaderBooks","recentAdd","deletedBooks","favoriteBooks","shelfList","txtParsers","aiModelConfig","readingStats","noteTags","recordLocation","thirdpartyToken","sortedShelfList","kindleDeviceList","thirdpartyToken","opdsCatalogs","opdsCatalogList"],copyArrayBuffer:e=>{var a=new ArrayBuffer(e.byteLength);return new Uint8Array(a).set(new Uint8Array(e)),a},base64ToArrayBuffer:g,arrayBufferToBase64:f,generateSHA256Hash:y,simpleEncrypt:function(e,a){if(!e||!a)return"";const t=N((new TextEncoder).encode(a)),o=Array.from(new Uint8Array(t)),i=(new TextEncoder).encode(e),n=new Uint8Array(i.length);for(let e=0;e{const a=new Set(["anthropic","zhipu","doubao","moonshot","deepseek","minimax","minimaxi"]),t=new Set(["qwen","hunyuan","siliconflow","siliconflowglobal","infini"]),o=new Set(["sensenova","openai"]),i=new Set(["ollama"]);return e&&"custom"!==e?a.has(e)?{thinking:{type:"disabled"}}:t.has(e)?{enable_thinking:!1}:o.has(e)?{reasoning_effort:"none"}:i.has(e)?{think:!1}:{}:{}},EmailProviders:["gmail.com","qq.com","163.com","yahoo.com","sina.com","sina.cn","126.com","outlook.com","yeah.net","foxmail.com","hotmail.com","protonmail.com","proton.me","icloud.com","mail.com","live.com","live.cn","msn.cn","msn.com","aliyun.com","sohu.com","yandex.com","naver.com","mail.ru","yahoo.co.jp","139.com","189.com","yandex.ru","189.cn"],Base64:v};const E={cloudUrl:"https://cloud.koodoreader.com",cloudCNUrl:"https://cloud.koodoreader.cn",testUrl:"https://cloudtestv2.960960.xyz",devUrl:"http://192.168.28.159:8000"},C={callbackUrl:"https://web.koodoreader.com/",cnCallbackUrl:"https://web.koodoreader.cn/",dropboxClientId:"vnc67byrssocvy1",yandexClientId:"e5305b62f53844b1994f77a840fd0a37",pcloudClientId:"pg8ten0B3vH",boxClientId:"ltimecqanmpxoaicn9qw3es6l3sdl1ya",duboxClientId:"kc0Ls6xLZugGgLLVhZ8yhUU1cRkRoKNU",yiyiwuClientId:"100197197",microsoftClientId:"506df58a-29ab-4020-afc5-6f423dc80f35",googleClientId:"1051055003225-ph1f5fvh328dhv7bco5jitlnfhg6ks2t.apps.googleusercontent.com",appleClientId:"com.koodoreader.auth",facebookClientId:"2845583825559500",githubClientId:"Ov23liJVzfvJMMEEZ8v2",adriveClientId:"a128ae7b9c094545af623de61dc0a1ef"},T={google:{clientId:C.googleClientId,scopes:["openid email profile"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"openid email profile"}},microsoft:{clientId:C.microsoftClientId,scopes:["openid","profile","User.Read","offline_access"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"openid profile User.Read offline_access"}},facebook:{clientId:C.facebookClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:""}},github:{clientId:C.githubClientId,scopes:["user:email"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"user:email"}},apple:{clientId:C.appleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{}},email:{clientId:"",scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:""}}},w=["backgroundColor","textColor","fontSize","margin","letterSpacing","paraSpacing","scale","brightness","fontFamily","subFontFamily","lineHeight","textAlign","textOrientation","convertChinese","selectAction","fullTranslationMode","readerMode","pdfReaderMode","isBold","isIndent","isSliding","isUnderline","isShadow","isItalic","isInvert","isBionic","isHyphenation","isOrphanWidow","isKeepPDFBackground","isAllowScript","isStartFromEven"];var A={CloudMode:"production",CloudConfig:E,ConvertLangMap:{en:"English",zhCN:"Chinese",zhTW:"Chinese",zhMO:"Chinese",tr:"Turkish",ar:"Arabic",ro:"Romanian",pl:"Polish",cs:"Czech",ja:"Japanese",ta:"Tamil",uk:"Ukrainian",sl:"Slovenian",bo:"Tibetan",id:"Indonesian",hy:"Armenian",el:"Greek",hu:"Hungarian",hi:"Hindi",bg:"Bulgarian",nl:"Dutch",it:"Italian",bn:"Bengali",tl:"Tagalog",sv:"Swedish",ga:"Irish",ko:"Korean",de:"German",ru:"Russian",es:"Spanish",fr:"French",fa:"Persian",ptBR:"Portuguese",th:"Thai",sr:"Serbian",am:"Amharic",da:"Danish",fi:"Finnish",ie:"Interlingue",pt:"Portuguese",vi:"Vietnamese"},ContentRegxConfig:[{label:"Default parser",value:"Default parser",subtitle:"Suitable for most txt files",regex:""},{label:"Chinese novel parser",value:"Chinese novel parser",subtitle:"Suitable for most Chinese novels, eg. 第一章,第2回",regex:"^\\s*(第[0-9一二三四五六七八九十百千万零壹贰叁肆伍陆柒捌玖拾佰仟]+[章回])\\s*"},{label:"English novel parser",value:"English novel parser",subtitle:"Suitable for most English novels, eg. Chapter 1, Part II",regex:"^\\s*(Chapter|Part|Book|CHAPTER|PART|BOOK)\\s*"},{label:"Number parser",value:"Number parser",subtitle:"Suitable for novels with number chapter titles, eg. 1, 2, 3",regex:"^\\s*([0-9]+[\\s.、::·\\-—]+|[一二三四五六七八九十百千万零]+[\\s.、::·\\-—]+).+"}],StyleKeys:w,ThirdpartyConfig:C,LoginAuthRequest:T,LoginDiscovery:{microsoft:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"},facebook:{authorizationEndpoint:"https://www.facebook.com/v12.0/dialog/oauth",tokenEndpoint:"https://graph.facebook.com/v12.0/oauth/access_token"},github:{authorizationEndpoint:"https://github.com/login/oauth/authorize",tokenEndpoint:"https://github.com/login/oauth/access_token"},apple:{authorizationEndpoint:"https://appleid.apple.com/auth/authorize",tokenEndpoint:"https://appleid.apple.com/auth/token"},email:{authorizationEndpoint:"",tokenEndpoint:""}},DriveAuthRequest:{dropbox:{clientId:C.dropboxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{token_access_type:"offline"}},yandex:{clientId:C.yandexClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code",force_confirm:"true"}},boxnet:{clientId:C.boxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}},pcloud:{clientId:C.pcloudClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code"}},dubox:{clientId:C.duboxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code",scope:"basic,netdisk",device_id:"119827642",qrcode:"1"}},yiyiwu:{clientId:C.yiyiwuClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code"}},adrive:{clientId:C.adriveClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}},microsoft:{clientId:C.microsoftClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"files.readwrite.appfolder offline_access"}},google:{clientId:C.googleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"https://www.googleapis.com/auth/drive.file",access_type:"offline"}},microsoft_exp:{clientId:C.microsoftClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"files.readwrite.all offline_access"}},google_exp:{clientId:C.googleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"https://www.googleapis.com/auth/drive",access_type:"offline"}}},DriveDiscovery:{dropbox:{authorizationEndpoint:"https://www.dropbox.com/oauth2/authorize",tokenEndpoint:"https://www.dropbox.com/oauth2/token"},yandex:{authorizationEndpoint:"https://oauth.yandex.com/authorize",tokenEndpoint:"https://oauth.yandex.com/token"},boxnet:{authorizationEndpoint:"https://account.box.com/api/oauth2/authorize",tokenEndpoint:"https://api.box.com/oauth2/token"},pcloud:{authorizationEndpoint:"https://my.pcloud.com/oauth2/authorize",tokenEndpoint:"https://api.pcloud.com/oauth2_token"},dubox:{authorizationEndpoint:"https://openapi.baidu.com/oauth/2.0/authorize",tokenEndpoint:"https://openapi.baidu.com/oauth/2.0/token"},yiyiwu:{authorizationEndpoint:"https://passportapi.115.com/open/authorize",tokenEndpoint:"https://passportapi.115.com/open/authorize"},adrive:{authorizationEndpoint:"https://openapi.alipan.com/oauth/authorize",tokenEndpoint:"https://openapi.alipan.com/oauth/token"},microsoft:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"},microsoft_exp:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google_exp:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"}},AiProviderList:[{id:"custom",name:"Custom model",defaultEndpoint:"",modelsEndpoint:"",isCNAvailable:!0},{id:"openai",name:"OpenAI",defaultEndpoint:"https://api.openai.com/v1",modelsEndpoint:"https://api.openai.com/v1/models"},{id:"anthropic",name:"Anthropic",defaultEndpoint:"https://api.anthropic.com/v1",modelsEndpoint:"https://api.anthropic.com/v1/models"},{id:"google",name:"Google Gemini",defaultEndpoint:"https://generativelanguage.googleapis.com/v1beta/openai",modelsEndpoint:"https://generativelanguage.googleapis.com/v1beta/openai/models"},{id:"deepseek",name:"DeepSeek",defaultEndpoint:"https://api.deepseek.com/v1",modelsEndpoint:"https://api.deepseek.com/v1/models",isCNAvailable:!0},{id:"mistral",name:"Mistral AI",defaultEndpoint:"https://api.mistral.ai/v1",modelsEndpoint:"https://api.mistral.ai/v1/models"},{id:"cohere",name:"Cohere",defaultEndpoint:"https://api.cohere.ai/compatibility/v1",modelsEndpoint:"https://api.cohere.ai/compatibility/v1/models"},{id:"groq",name:"Groq",defaultEndpoint:"https://api.groq.com/openai/v1",modelsEndpoint:"https://api.groq.com/openai/v1/models"},{id:"together",name:"Together AI",defaultEndpoint:"https://api.together.xyz/v1",modelsEndpoint:"https://api.together.xyz/v1/models"},{id:"fireworks",name:"Fireworks AI",defaultEndpoint:"https://api.fireworks.ai/inference/v1",modelsEndpoint:"https://api.fireworks.ai/inference/v1/models"},{id:"perplexity",name:"Perplexity",defaultEndpoint:"https://api.perplexity.ai",modelsEndpoint:"https://api.perplexity.ai/v1/models"},{id:"openrouter",name:"OpenRouter",defaultEndpoint:"https://openrouter.ai/api/v1",modelsEndpoint:"https://openrouter.ai/api/v1/models"},{id:"ai21",name:"AI21 Labs",defaultEndpoint:"https://api.ai21.com/studio/v1",modelsEndpoint:"https://api.ai21.com/studio/v1/models"},{id:"xai",name:"xAI (Grok)",defaultEndpoint:"https://api.x.ai/v1",modelsEndpoint:"https://api.x.ai/v1/models"},{id:"sambanova",name:"SambaNova",defaultEndpoint:"https://api.sambanova.ai/v1",modelsEndpoint:"https://api.sambanova.ai/v1/models"},{id:"cerebras",name:"Cerebras",defaultEndpoint:"https://api.cerebras.ai/v1",modelsEndpoint:"https://api.cerebras.ai/v1/models"},{id:"hyperbolic",name:"Hyperbolic",defaultEndpoint:"https://api.hyperbolic.xyz/v1",modelsEndpoint:"https://api.hyperbolic.xyz/v1/models"},{id:"novita",name:"Novita AI",defaultEndpoint:"https://api.novita.ai/openai",modelsEndpoint:"https://api.novita.ai/openai/models"},{id:"lepton",name:"Lepton AI",defaultEndpoint:"https://llm.lepton.run/api/v1",modelsEndpoint:"https://llm.lepton.run/api/v1/models"},{id:"deepinfra",name:"DeepInfra",defaultEndpoint:"https://api.deepinfra.com/v1/openai",modelsEndpoint:"https://api.deepinfra.com/v1/openai/models"},{id:"replicate",name:"Replicate",defaultEndpoint:"https://api.replicate.com/v1",modelsEndpoint:"https://api.replicate.com/v1/models"},{id:"zhipu",name:"Zhipu AI (智谱)",defaultEndpoint:"https://open.bigmodel.cn/api/paas/v4",modelsEndpoint:"https://open.bigmodel.cn/api/paas/v4/models",isCNAvailable:!0},{id:"qwen",name:"Alibaba Qwen (通义千问)",defaultEndpoint:"https://dashscope.aliyuncs.com/compatible-mode/v1",modelsEndpoint:"https://dashscope.aliyuncs.com/compatible-mode/v1/models",isCNAvailable:!0},{id:"moonshot",name:"Moonshot (月之暗面)",defaultEndpoint:"https://api.moonshot.cn/v1",modelsEndpoint:"https://api.moonshot.cn/v1/models",isCNAvailable:!0},{id:"baidu",name:"Baidu ERNIE (文心一言)",defaultEndpoint:"https://qianfan.baidubce.com/v2",modelsEndpoint:"https://qianfan.baidubce.com/v2/models",isCNAvailable:!0},{id:"doubao",name:"Volcengine Doubao (豆包)",defaultEndpoint:"https://ark.cn-beijing.volces.com/api/v3",modelsEndpoint:"https://ark.cn-beijing.volces.com/api/v3/models",isCNAvailable:!0},{id:"spark",name:"iFlytek Spark (讯飞星火)",defaultEndpoint:"https://spark-api-open.xf-yun.com/v1",modelsEndpoint:"https://spark-api-open.xf-yun.com/v1/models",isCNAvailable:!0},{id:"hunyuan",name:"Tencent Hunyuan (腾讯混元)",defaultEndpoint:"https://api.hunyuan.cloud.tencent.com/v1",modelsEndpoint:"https://api.hunyuan.cloud.tencent.com/v1/models",isCNAvailable:!0},{id:"minimaxi",name:"MiniMax (国内版)",defaultEndpoint:"https://api.minimaxi.com/v1",modelsEndpoint:"https://api.minimaxi.com/v1/models",isCNAvailable:!0},{id:"minimax",name:"MiniMax (国际版)",defaultEndpoint:"https://api.minimax.io/v1",modelsEndpoint:"https://api.minimax.io/v1/models"},{id:"baichuan",name:"Baichuan (百川)",defaultEndpoint:"https://api.baichuan-ai.com/v1",modelsEndpoint:"https://api.baichuan-ai.com/v1/models",isCNAvailable:!0},{id:"stepfun",name:"StepFun (阶跃星辰)",defaultEndpoint:"https://api.stepfun.com/v1",modelsEndpoint:"https://api.stepfun.com/v1/models",isCNAvailable:!0},{id:"lingyi",name:"Lingyiwanwu (零一万物)",defaultEndpoint:"https://api.lingyiwanwu.com/v1",modelsEndpoint:"https://api.lingyiwanwu.com/v1/models",isCNAvailable:!0},{id:"siliconflow",name:"SiliconFlow (硅基流动)",defaultEndpoint:"https://api.siliconflow.cn/v1",modelsEndpoint:"https://api.siliconflow.cn/v1/models",isCNAvailable:!0},{id:"siliconflowglobal",name:"SiliconFlow (国际版)",defaultEndpoint:"https://api.siliconflow.com/v1",modelsEndpoint:"https://api.siliconflow.com/v1/models"},{id:"sensenova",name:"SenseNova (日日新)",defaultEndpoint:"https://token.sensenova.cn/v1",modelsEndpoint:"https://token.sensenova.cn/v1/models",isCNAvailable:!0},{id:"infini",name:"Infini AI (无问芯穹)",defaultEndpoint:"https://cloud.infini-ai.com/maas/v1",modelsEndpoint:"https://cloud.infini-ai.com/maas/v1/models",isCNAvailable:!0},{id:"ollama",name:"Ollama (Local)",defaultEndpoint:"http://localhost:11434/v1",modelsEndpoint:"http://localhost:11434/v1/models",isCNAvailable:!0},{id:"lmstudio",name:"LM Studio (Local)",defaultEndpoint:"http://localhost:1234/v1",modelsEndpoint:"http://localhost:1234/v1/models",isCNAvailable:!0},{id:"vllm",name:"vLLM (Local)",defaultEndpoint:"http://localhost:8000/v1",modelsEndpoint:"http://localhost:8000/v1/models",isCNAvailable:!0},{id:"azure",name:"Azure OpenAI",defaultEndpoint:"",modelsEndpoint:""},{id:"aws_bedrock",name:"AWS Bedrock",defaultEndpoint:"",modelsEndpoint:""}],DefaultPrompts:{aiTranslate:"You are a professional translator. Translate the following text from {from} to {to}. Only return the translated text, no explanations.\n\nText: {text}",aiDict:"You are a professional dictionary assistant. Analyze the word or phrase: {word}\nProvide a comprehensive explanation including pronunciation, definitions, example sentences, and usage notes using {to} as the target language. ",aiAssistance:"You are a helpful reading assistant. The user is reading a book. Here is the context:\n{text}\n\nAnswer the user's question concisely and helpfully, and reply with the same language."},SpeechList:[{label:"English",code:"en",example:"To be, or not to be, that is the question."},{label:"Simplified Chinese",code:"zh",example:"千里之行,始于足下。"},{label:"Japanese",code:"ja",example:"猿も木から落ちる。"},{label:"Korean",code:"ko",example:"가는 날이 장날이다."},{label:"French",code:"fr",example:"Liberté, égalité, fraternité."},{label:"German",code:"de",example:"Der Weg ist das Ziel."},{label:"Spanish",code:"es",example:"La vida es un sueño."},{label:"Italian",code:"it",example:"Dolce far niente."},{label:"Russian",code:"ru",example:"Век живи, век учись."},{label:"Portuguese",code:"pt",example:"Saudade é um sentimento profundo."},{label:"Hindi",code:"hi",example:"सपने वो नहीं जो हम सोते वक्त देखते हैं।"},{label:"Afrikaans",code:"af",example:"Die lewe is 'n geskenk."},{label:"Amharic",code:"am",example:"ዕውቀት ብርሃን ነው።"},{label:"Arabic",code:"ar",example:"العلم نور والجهل ظلام."},{label:"Azerbaijani",code:"az",example:"Elm işıqdır, cəhalət zülmət."},{label:"Bulgarian",code:"bg",example:"Знанието е сила."},{label:"Bengali",code:"bn",example:"জ্ঞানই শক্তি।"},{label:"Bosnian",code:"bs",example:"Znanje je moć."},{label:"Catalan",code:"ca",example:"El saber no ocupa lloc."},{label:"Czech",code:"cs",example:"Bez práce nejsou koláče."},{label:"Welsh",code:"cy",example:"Nid aur popeth melyn."},{label:"Danish",code:"da",example:"Lykken er ikke et sted, men en retning."},{label:"Greek",code:"el",example:"Η γνώση είναι δύναμη."},{label:"Estonian",code:"et",example:"Teadmine on jõud."},{label:"Basque",code:"eu",example:"Jakitea boterea da."},{label:"Persian",code:"fa",example:"دانش قدرت است."},{label:"Finnish",code:"fi",example:"Tieto on valtaa."},{label:"Filipino",code:"fil",example:"Ang kaalaman ay kapangyarihan."},{label:"Irish",code:"ga",example:"Is fearr Gaeilge briste ná Béarla cliste."},{label:"Galician",code:"gl",example:"O saber non ocupa lugar."},{label:"Gujarati",code:"gu",example:"જ્ઞાન શક્તિ છે."},{label:"Hebrew",code:"he",example:"ידע הוא כוח."},{label:"Croatian",code:"hr",example:"Znanje je moć."},{label:"Hungarian",code:"hu",example:"A tudás hatalom."},{label:"Armenian",code:"hy",example:"Գիտելիքը ուժ է."},{label:"Indonesian",code:"id",example:"Pengetahuan adalah kekuatan."},{label:"Icelandic",code:"is",example:"Þekking er máttur."},{label:"Inuktitut",code:"iu",example:"ᐃᓕᓐᓂᐊᕐᓂᖅ ᐱᒻᒪᕆᐅᕗᖅ."},{label:"Javanese",code:"jv",example:"Ilmu iku kelakone kanthi laku."},{label:"Georgian",code:"ka",example:"ცოდნა ძალაა."},{label:"Kazakh",code:"kk",example:"Білім — күш."},{label:"Khmer",code:"km",example:"ចំណេះដឹងគឺជាអំណាច។"},{label:"Kannada",code:"kn",example:"ಜ್ಞಾನವೇ ಶಕ್ತಿ."},{label:"Lao",code:"lo",example:"ຄວາມຮູ້ຄືພະລັງ."},{label:"Lithuanian",code:"lt",example:"Žinios yra jėga."},{label:"Latvian",code:"lv",example:"Zināšanas ir spēks."},{label:"Macedonian",code:"mk",example:"Знаењето е моќ."},{label:"Malayalam",code:"ml",example:"അറിവ് ശക്തിയാണ്."},{label:"Mongolian",code:"mn",example:"Мэдлэг бол хүч."},{label:"Marathi",code:"mr",example:"ज्ञान हीच शक्ती आहे."},{label:"Malay",code:"ms",example:"Ilmu itu cahaya."},{label:"Maltese",code:"mt",example:"L-għarfien huwa l-poter."},{label:"Burmese",code:"my",example:"ဗဟုသုတသည် အားဖြစ်သည်။"},{label:"Norwegian",code:"nb",example:"Kunnskap er makt."},{label:"Nepali",code:"ne",example:"ज्ञान नै शक्ति हो।"},{label:"Dutch",code:"nl",example:"Kennis is macht."},{label:"Odia",code:"or",example:"ଜ୍ଞାନ ହିଁ ଶକ୍ତି।"},{label:"Punjabi",code:"pa",example:"ਗਿਆਨ ਹੀ ਸ਼ਕਤੀ ਹੈ।"},{label:"Polish",code:"pl",example:"Wiedza to potęga."},{label:"Pashto",code:"ps",example:"د پوهې ډیوه روښانه ده."},{label:"Romanian",code:"ro",example:"Cartea este o comoară."},{label:"Sinhala",code:"si",example:"දැනුම බලයකි."},{label:"Slovak",code:"sk",example:"Vedomosti sú sila."},{label:"Slovenian",code:"sl",example:"Znanje je moč."},{label:"Somali",code:"so",example:"Aqoontu waa iftiin."},{label:"Albanian",code:"sq",example:"Dija është fuqi."},{label:"Serbian",code:"sr",example:"Знање је моћ."},{label:"Sundanese",code:"su",example:"Élmu éta cahaya."},{label:"Swedish",code:"sv",example:"Kunskap är makt."},{label:"Swahili",code:"sw",example:"Maarifa ni nguvu."},{label:"Tamil",code:"ta",example:"அறிவே ஆற்றல்."},{label:"Telugu",code:"te",example:"జ్ఞానమే శక్తి."},{label:"Thai",code:"th",example:"ความรู้คือพลัง."},{label:"Turkish",code:"tr",example:"Bilgi güçtür."},{label:"Ukrainian",code:"uk",example:"Знання — сила."},{label:"Urdu",code:"ur",example:"علم ہی طاقت ہے۔"},{label:"Uzbek",code:"uz",example:"Bilim – kuch."},{label:"Vietnamese",code:"vi",example:"Học vấn là sức mạnh."},{label:"Wu Chinese",code:"wuu",example:"学问是力量。"},{label:"Cantonese",code:"yue",example:"知識就係力量。"},{label:"Zulu",code:"zu",example:"Ulwazi lungamandla."}],HighlightStyleTypes:[{value:"background",label:"Highlight background"},{value:"underline",label:"Underline"},{value:"strikethrough",label:"Strikethrough"},{value:"wavy",label:"Wavy underline"}],HighlightPresetColors:{background:["#F3C9C9","#FEF3CD","#CEFACD","#CDE9FA"],underline:["#FF0000","#60A5FA","#FF9900","#2EFF2E"],strikethrough:["#FF0000","#60A5FA","#FF9900","#2EFF2E"],wavy:["#FF0000","#60A5FA","#FF9900","#2EFF2E"]},PresetThemeList:[{key:"yellow",textColor:"rgba(89, 68, 41,1)",backgroundColor:"rgba(233, 216, 188,1)",title:"羊皮"},{key:"green",textColor:"rgba(54, 80, 62,1)",backgroundColor:"rgba(197, 231, 207,1)",title:"护眼"},{key:"light",textColor:"rgba(0,0,0,1)",backgroundColor:"rgba(255,255,255,1)",title:"白天"},{key:"night",textColor:"rgba(255,255,255,1)",backgroundColor:"rgba(44,47,49,1)",title:"黑夜"},{key:"sepia",textColor:"rgba(93, 64, 55,1)",backgroundColor:"rgba(245, 235, 220,1)",title:"古卷"},{key:"blue",textColor:"rgba(28, 52, 84,1)",backgroundColor:"rgba(230, 240, 250,1)",title:"晨雾"},{key:"purple",textColor:"rgba(68, 42, 84,1)",backgroundColor:"rgba(240, 230, 250,1)",title:"紫萝"},{key:"pink",textColor:"rgba(84, 42, 68,1)",backgroundColor:"rgba(250, 235, 245,1)",title:"樱花"},{key:"brown",textColor:"rgba(74, 54, 42,1)",backgroundColor:"rgba(240, 230, 215,1)",title:"木纹"},{key:"gray",textColor:"rgba(64, 64, 64,1)",backgroundColor:"rgba(240, 240, 240,1)",title:"素雅"},{key:"darkgreen",textColor:"rgba(200, 220, 200,1)",backgroundColor:"rgba(25, 35, 30,1)",title:"深林"},{key:"darkblue",textColor:"rgba(200, 210, 230,1)",backgroundColor:"rgba(20, 30, 45,1)",title:"深海"},{key:"coral",textColor:"rgba(84, 50, 42,1)",backgroundColor:"rgba(255, 235, 230,1)",title:"珊瑚"},{key:"mint",textColor:"rgba(42, 74, 64,1)",backgroundColor:"rgba(230, 250, 245,1)",title:"薄荷"},{key:"lavender",textColor:"rgba(54, 42, 74,1)",backgroundColor:"rgba(245, 240, 255,1)",title:"薰衣"},{key:"cream",textColor:"rgba(74, 64, 42,1)",backgroundColor:"rgba(255, 250, 240,1)",title:"奶油"},{key:"darkbrown",textColor:"rgba(230, 215, 200,1)",backgroundColor:"rgba(35, 25, 20,1)",title:"深棕"},{key:"olive",textColor:"rgba(64, 74, 42,1)",backgroundColor:"rgba(240, 245, 230,1)",title:"橄榄"},{key:"rose",textColor:"rgba(84, 42, 54,1)",backgroundColor:"rgba(255, 240, 245,1)",title:"玫瑰"},{key:"slate",textColor:"rgba(54, 64, 74,1)",backgroundColor:"rgba(235, 240, 245,1)",title:"石板"}],OfficialVoiceList:[{name:"af_alloy",gender:"female",displayName:"Alloy",locale:"en-US",language:"English (US)"},{name:"af_aoede",gender:"female",displayName:"Aoede",locale:"en-US",language:"English (US)"},{name:"af_bella",gender:"female",displayName:"Bella",locale:"en-US",language:"English (US)"},{name:"af_heart",gender:"female",displayName:"Heart",locale:"en-US",language:"English (US)"},{name:"af_jessica",gender:"female",displayName:"Jessica",locale:"en-US",language:"English (US)"},{name:"af_kore",gender:"female",displayName:"Kore",locale:"en-US",language:"English (US)"},{name:"af_nicole",gender:"female",displayName:"Nicole",locale:"en-US",language:"English (US)"},{name:"af_nova",gender:"female",displayName:"Nova",locale:"en-US",language:"English (US)"},{name:"af_river",gender:"female",displayName:"River",locale:"en-US",language:"English (US)"},{name:"af_sarah",gender:"female",displayName:"Sarah",locale:"en-US",language:"English (US)"},{name:"af_sky",gender:"female",displayName:"Sky",locale:"en-US",language:"English (US)"},{name:"am_adam",gender:"male",displayName:"Adam",locale:"en-US",language:"English (US)"},{name:"am_echo",gender:"male",displayName:"Echo",locale:"en-US",language:"English (US)"},{name:"am_eric",gender:"male",displayName:"Eric",locale:"en-US",language:"English (US)"},{name:"am_fenrir",gender:"male",displayName:"Fenrir",locale:"en-US",language:"English (US)"},{name:"am_liam",gender:"male",displayName:"Liam",locale:"en-US",language:"English (US)"},{name:"am_michael",gender:"male",displayName:"Michael",locale:"en-US",language:"English (US)"},{name:"am_onyx",gender:"male",displayName:"Onyx",locale:"en-US",language:"English (US)"},{name:"am_puck",gender:"male",displayName:"Puck",locale:"en-US",language:"English (US)"},{name:"am_santa",gender:"male",displayName:"Santa",locale:"en-US",language:"English (US)"},{name:"bf_alice",gender:"female",displayName:"Alice",locale:"en-GB",language:"English (UK)"},{name:"bf_emma",gender:"female",displayName:"Emma",locale:"en-GB",language:"English (UK)"},{name:"bf_isabella",gender:"female",displayName:"Isabella",locale:"en-GB",language:"English (UK)"},{name:"bf_lily",gender:"female",displayName:"Lily",locale:"en-GB",language:"English (UK)"},{name:"bm_daniel",gender:"male",displayName:"Daniel",locale:"en-GB",language:"English (UK)"},{name:"bm_fable",gender:"male",displayName:"Fable",locale:"en-GB",language:"English (UK)"},{name:"bm_george",gender:"male",displayName:"George",locale:"en-GB",language:"English (UK)"},{name:"bm_lewis",gender:"male",displayName:"Lewis",locale:"en-GB",language:"English (UK)"},{name:"ef_dora",gender:"female",displayName:"Dora",locale:"es-ES",language:"Español"},{name:"em_alex",gender:"male",displayName:"Alex",locale:"es-ES",language:"Español"},{name:"em_santa",gender:"male",displayName:"Santa",locale:"es-ES",language:"Español"},{name:"ff_siwis",gender:"female",displayName:"Siwis",locale:"fr-FR",language:"Français"},{name:"hf_alpha",gender:"female",displayName:"Alpha",locale:"hi-IN",language:"हिन्दी"},{name:"hf_beta",gender:"female",displayName:"Beta",locale:"hi-IN",language:"हिन्दी"},{name:"hm_omega",gender:"male",displayName:"Omega",locale:"hi-IN",language:"हिन्दी"},{name:"hm_psi",gender:"male",displayName:"Psi",locale:"hi-IN",language:"हिन्दी"},{name:"if_sara",gender:"female",displayName:"Sara",locale:"it-IT",language:"Italiano"},{name:"im_nicola",gender:"male",displayName:"Nicola",locale:"it-IT",language:"Italiano"},{name:"jf_alpha",gender:"female",displayName:"Alpha",locale:"ja-JP",language:"日本語"},{name:"jf_gongitsune",gender:"female",displayName:"Gongitsune",locale:"ja-JP",language:"日本語"},{name:"jf_nezumi",gender:"female",displayName:"Nezumi",locale:"ja-JP",language:"日本語"},{name:"jf_tebukuro",gender:"female",displayName:"Tebukuro",locale:"ja-JP",language:"日本語"},{name:"jm_kumo",gender:"male",displayName:"Kumo",locale:"ja-JP",language:"日本語"},{name:"pf_dora",gender:"female",displayName:"Dora",locale:"pt-BR",language:"Português (Brasil)"},{name:"pm_alex",gender:"male",displayName:"Alex",locale:"pt-BR",language:"Português (Brasil)"},{name:"pm_santa",gender:"male",displayName:"Santa",locale:"pt-BR",language:"Português (Brasil)"},{name:"zf_xiaoxiao",gender:"female",displayName:"Xiaoxiao",locale:"zh-CN",language:"中文"},{name:"zm_yunxi",gender:"male",displayName:"Yunxi",locale:"zh-CN",language:"中文"},{name:"zf_xiaoyi",gender:"female",displayName:"Xiaoyi",locale:"zh-CN",language:"中文"},{name:"zm_yunyang",gender:"male",displayName:"Yunyang",locale:"zh-CN",language:"中文"},{name:"zm_yunxia",gender:"male",displayName:"Yunxia",locale:"zh-CN",language:"中文"},{name:"zm_yunjian",gender:"male",displayName:"Yunjian",locale:"zh-CN",language:"中文"},{name:"zf_xiaoni",gender:"female",displayName:"Xiaoni 陕西",locale:"zh-CN",language:"中文"},{name:"zf_xiaobei",gender:"female",displayName:"Xiaobei 辽宁",locale:"zh-CN",language:"中文"}],AzureTTSVoiceList:[{name:"de-DE-AmalaNeural",gender:"female",displayName:"Amala",locale:"de-DE"},{name:"de-DE-BerndNeural",gender:"male",displayName:"Bernd",locale:"de-DE"},{name:"de-DE-ConradNeural",gender:"male",displayName:"Conrad",locale:"de-DE"},{name:"de-DE-KatjaNeural",gender:"female",displayName:"Katja",locale:"de-DE"},{name:"en-GB-LibbyNeural",gender:"female",displayName:"Libby",locale:"en-GB"},{name:"en-GB-RyanNeural",gender:"male",displayName:"Ryan",locale:"en-GB"},{name:"en-GB-SoniaNeural",gender:"female",displayName:"Sonia",locale:"en-GB"},{name:"en-US-AmberNeural",gender:"female",displayName:"Amber",locale:"en-US"},{name:"en-US-AriaNeural",gender:"female",displayName:"Aria",locale:"en-US"},{name:"en-US-ChristopherNeural",gender:"male",displayName:"Christopher",locale:"en-US"},{name:"en-US-DavisNeural",gender:"male",displayName:"Davis",locale:"en-US"},{name:"en-US-EricNeural",gender:"male",displayName:"Eric",locale:"en-US"},{name:"en-US-GuyNeural",gender:"male",displayName:"Guy",locale:"en-US"},{name:"en-US-JaneNeural",gender:"female",displayName:"Jane",locale:"en-US"},{name:"en-US-JennyNeural",gender:"female",displayName:"Jenny",locale:"en-US"},{name:"en-US-MichelleNeural",gender:"female",displayName:"Michelle",locale:"en-US"},{name:"en-US-SaraNeural",gender:"female",displayName:"Sara",locale:"en-US"},{name:"es-ES-AbrilNeural",gender:"female",displayName:"Abril",locale:"es-ES"},{name:"es-ES-AlvaroNeural",gender:"male",displayName:"Álvaro",locale:"es-ES"},{name:"es-ES-ArnauNeural",gender:"male",displayName:"Arnau",locale:"es-ES"},{name:"es-ES-ElviraNeural",gender:"female",displayName:"Elvira",locale:"es-ES"},{name:"fr-FR-DeniseNeural",gender:"female",displayName:"Denise",locale:"fr-FR"},{name:"fr-FR-HenriNeural",gender:"male",displayName:"Henri",locale:"fr-FR"},{name:"it-IT-BenignoNeural",gender:"male",displayName:"Benigno",locale:"it-IT"},{name:"it-IT-DiegoNeural",gender:"male",displayName:"Diego",locale:"it-IT"},{name:"it-IT-ElsaNeural",gender:"female",displayName:"Elsa",locale:"it-IT"},{name:"it-IT-IsabellaNeural",gender:"female",displayName:"Isabella",locale:"it-IT"},{name:"ja-JP-KeitaNeural",gender:"male",displayName:"圭太",locale:"ja-JP"},{name:"ja-JP-NanamiNeural",gender:"female",displayName:"七海",locale:"ja-JP"},{name:"ko-KR-InJoonNeural",gender:"male",displayName:"인준",locale:"ko-KR"},{name:"ko-KR-SoonBokNeural",gender:"female",displayName:"순복",locale:"ko-KR"},{name:"ko-KR-SunHiNeural",gender:"female",displayName:"선히",locale:"ko-KR"},{name:"pt-BR-AntonioNeural",gender:"male",displayName:"Antônio",locale:"pt-BR"},{name:"pt-BR-FranciscaNeural",gender:"female",displayName:"Francisca",locale:"pt-BR"},{name:"pt-PT-DuarteNeural",gender:"male",displayName:"Duarte",locale:"pt-PT"},{name:"pt-PT-RaquelNeural",gender:"female",displayName:"Raquel",locale:"pt-PT"},{name:"ru-RU-DariyaNeural",gender:"female",displayName:"Дария",locale:"ru-RU"},{name:"ru-RU-DmitryNeural",gender:"male",displayName:"Дмитрий",locale:"ru-RU"},{name:"ru-RU-SvetlanaNeural",gender:"female",displayName:"Светлана",locale:"ru-RU"},{name:"yue-CN-XiaoMinNeural",gender:"female",displayName:"晓敏",locale:"yue-CN"},{name:"yue-CN-YunSongNeural",gender:"male",displayName:"云松",locale:"yue-CN"},{name:"zh-CN-XiaoxiaoNeural",gender:"female",displayName:"晓晓",locale:"zh-CN"},{name:"zh-CN-YunxiNeural",gender:"male",displayName:"云希",locale:"zh-CN"},{name:"zh-HK-HiuMaanNeural",gender:"female",displayName:"曉曼",locale:"zh-HK"},{name:"zh-HK-WanLungNeural",gender:"male",displayName:"雲龍",locale:"zh-HK"},{name:"zh-TW-HsiaoChenNeural",gender:"female",displayName:"曉臻",locale:"zh-TW"},{name:"zh-TW-YunJheNeural",gender:"male",displayName:"雲哲",locale:"zh-TW"},{name:"af-ZA-AdriNeural",gender:"female",displayName:"Adri",locale:"af-ZA"},{name:"af-ZA-WillemNeural",gender:"male",displayName:"Willem",locale:"af-ZA"},{name:"sq-AL-AnilaNeural",gender:"female",displayName:"Anila",locale:"sq-AL"},{name:"sq-AL-IlirNeural",gender:"male",displayName:"Ilir",locale:"sq-AL"},{name:"am-ET-AmehaNeural",gender:"male",displayName:"አምሀ",locale:"am-ET"},{name:"am-ET-MekdesNeural",gender:"female",displayName:"መቅደስ",locale:"am-ET"},{name:"ar-DZ-AminaNeural",gender:"female",displayName:"أمينة",locale:"ar-DZ"},{name:"ar-DZ-IsmaelNeural",gender:"male",displayName:"إسماعيل",locale:"ar-DZ"},{name:"ar-BH-AliNeural",gender:"male",displayName:"علي",locale:"ar-BH"},{name:"ar-BH-LailaNeural",gender:"female",displayName:"ليلى",locale:"ar-BH"},{name:"ar-EG-SalmaNeural",gender:"female",displayName:"سلمى",locale:"ar-EG"},{name:"ar-EG-ShakirNeural",gender:"male",displayName:"شاكر",locale:"ar-EG"},{name:"ar-IQ-BasselNeural",gender:"male",displayName:"باسل",locale:"ar-IQ"},{name:"ar-IQ-RanaNeural",gender:"female",displayName:"رنا",locale:"ar-IQ"},{name:"ar-JO-SanaNeural",gender:"female",displayName:"سناء",locale:"ar-JO"},{name:"ar-JO-TaimNeural",gender:"male",displayName:"تيم",locale:"ar-JO"},{name:"ar-KW-FahedNeural",gender:"male",displayName:"فهد",locale:"ar-KW"},{name:"ar-KW-NouraNeural",gender:"female",displayName:"نورا",locale:"ar-KW"},{name:"ar-LB-LaylaNeural",gender:"female",displayName:"ليلى",locale:"ar-LB"},{name:"ar-LB-RamiNeural",gender:"male",displayName:"رامي",locale:"ar-LB"},{name:"ar-LY-ImanNeural",gender:"female",displayName:"إيمان",locale:"ar-LY"},{name:"ar-LY-OmarNeural",gender:"male",displayName:"أحمد",locale:"ar-LY"},{name:"ar-MA-JamalNeural",gender:"male",displayName:"جمال",locale:"ar-MA"},{name:"ar-MA-MounaNeural",gender:"female",displayName:"منى",locale:"ar-MA"},{name:"ar-OM-AbdullahNeural",gender:"male",displayName:"عبدالله",locale:"ar-OM"},{name:"ar-OM-AyshaNeural",gender:"female",displayName:"عائشة",locale:"ar-OM"},{name:"ar-QA-AmalNeural",gender:"female",displayName:"أمل",locale:"ar-QA"},{name:"ar-QA-MoazNeural",gender:"male",displayName:"معاذ",locale:"ar-QA"},{name:"ar-SA-HamedNeural",gender:"male",displayName:"حامد",locale:"ar-SA"},{name:"ar-SA-ZariyahNeural",gender:"female",displayName:"زارية",locale:"ar-SA"},{name:"ar-SY-AmanyNeural",gender:"female",displayName:"أماني",locale:"ar-SY"},{name:"ar-SY-LaithNeural",gender:"male",displayName:"ليث",locale:"ar-SY"},{name:"ar-TN-HediNeural",gender:"male",displayName:"هادي",locale:"ar-TN"},{name:"ar-TN-ReemNeural",gender:"female",displayName:"ريم",locale:"ar-TN"},{name:"ar-AE-FatimaNeural",gender:"female",displayName:"فاطمة",locale:"ar-AE"},{name:"ar-AE-HamdanNeural",gender:"male",displayName:"حمدان",locale:"ar-AE"},{name:"ar-YE-MaryamNeural",gender:"female",displayName:"مريم",locale:"ar-YE"},{name:"ar-YE-SalehNeural",gender:"male",displayName:"صالح",locale:"ar-YE"},{name:"az-AZ-BabekNeural",gender:"male",displayName:"Babək",locale:"az-AZ"},{name:"az-AZ-BanuNeural",gender:"female",displayName:"Banu",locale:"az-AZ"},{name:"bn-BD-NabanitaNeural",gender:"female",displayName:"নবনীতা",locale:"bn-BD"},{name:"bn-BD-PradeepNeural",gender:"male",displayName:"প্রদ্বীপ",locale:"bn-BD"},{name:"bn-IN-BashkarNeural",gender:"male",displayName:"ভাস্কর",locale:"bn-IN"},{name:"bn-IN-TanishaaNeural",gender:"female",displayName:"তানিশা",locale:"bn-IN"},{name:"bs-BA-VesnaNeural",gender:"female",displayName:"Vesna",locale:"bs-BA"},{name:"bs-BA-GoranNeural",gender:"male",displayName:"Goran",locale:"bs-BA"},{name:"bg-BG-BorislavNeural",gender:"male",displayName:"Борислав",locale:"bg-BG"},{name:"bg-BG-KalinaNeural",gender:"female",displayName:"Калина",locale:"bg-BG"},{name:"my-MM-NilarNeural",gender:"female",displayName:"နီလာ",locale:"my-MM"},{name:"my-MM-ThihaNeural",gender:"male",displayName:"သီဟ",locale:"my-MM"},{name:"ca-ES-EnricNeural",gender:"male",displayName:"Enric",locale:"ca-ES"},{name:"ca-ES-JoanaNeural",gender:"female",displayName:"Joana",locale:"ca-ES"},{name:"zh-HK-HiuGaaiNeural",gender:"female",displayName:"曉佳",locale:"zh-HK"},{name:"zh-CN-XiaoyiNeural",gender:"female",displayName:"晓伊",locale:"zh-CN"},{name:"zh-CN-YunjianNeural",gender:"male",displayName:"云健",locale:"zh-CN"},{name:"zh-CN-YunxiaNeural",gender:"male",displayName:"云夏",locale:"zh-CN"},{name:"zh-CN-YunyangNeural",gender:"male",displayName:"云扬",locale:"zh-CN"},{name:"zh-CN-liaoning-XiaobeiNeural",gender:"female",displayName:"晓北 辽宁",locale:"zh-CN"},{name:"zh-CN-shaanxi-XiaoniNeural",gender:"female",displayName:"晓妮 陕西",locale:"zh-CN"},{name:"zh-TW-HsiaoYuNeural",gender:"female",displayName:"曉雨",locale:"zh-TW"},{name:"hr-HR-GabrijelaNeural",gender:"female",displayName:"Gabrijela",locale:"hr-HR"},{name:"hr-HR-SreckoNeural",gender:"male",displayName:"Srećko",locale:"hr-HR"},{name:"cs-CZ-AntoninNeural",gender:"male",displayName:"Antonín",locale:"cs-CZ"},{name:"cs-CZ-VlastaNeural",gender:"female",displayName:"Vlasta",locale:"cs-CZ"},{name:"da-DK-ChristelNeural",gender:"female",displayName:"Christel",locale:"da-DK"},{name:"da-DK-JeppeNeural",gender:"male",displayName:"Jeppe",locale:"da-DK"},{name:"nl-BE-ArnaudNeural",gender:"male",displayName:"Arnaud",locale:"nl-BE"},{name:"nl-BE-DenaNeural",gender:"female",displayName:"Dena",locale:"nl-BE"},{name:"nl-NL-ColetteNeural",gender:"female",displayName:"Colette",locale:"nl-NL"},{name:"nl-NL-FennaNeural",gender:"female",displayName:"Fenna",locale:"nl-NL"},{name:"nl-NL-MaartenNeural",gender:"male",displayName:"Maarten",locale:"nl-NL"},{name:"en-AU-WilliamMultilingualNeural",gender:"male",displayName:"William Multilingual",locale:"en-AU"},{name:"en-AU-NatashaNeural",gender:"female",displayName:"Natasha",locale:"en-AU"},{name:"en-CA-ClaraNeural",gender:"female",displayName:"Clara",locale:"en-CA"},{name:"en-CA-LiamNeural",gender:"male",displayName:"Liam",locale:"en-CA"},{name:"en-HK-YanNeural",gender:"female",displayName:"Yan",locale:"en-HK"},{name:"en-HK-SamNeural",gender:"male",displayName:"Sam",locale:"en-HK"},{name:"en-IN-NeerjaNeural",gender:"female",displayName:"Neerja",locale:"en-IN"},{name:"en-IN-PrabhatNeural",gender:"male",displayName:"Prabhat",locale:"en-IN"},{name:"en-IE-ConnorNeural",gender:"male",displayName:"Connor",locale:"en-IE"},{name:"en-IE-EmilyNeural",gender:"female",displayName:"Emily",locale:"en-IE"},{name:"en-KE-AsiliaNeural",gender:"female",displayName:"Asilia",locale:"en-KE"},{name:"en-KE-ChilembaNeural",gender:"male",displayName:"Chilemba",locale:"en-KE"},{name:"en-NZ-MitchellNeural",gender:"male",displayName:"Mitchell",locale:"en-NZ"},{name:"en-NZ-MollyNeural",gender:"female",displayName:"Molly",locale:"en-NZ"},{name:"en-NG-AbeoNeural",gender:"male",displayName:"Abeo",locale:"en-NG"},{name:"en-NG-EzinneNeural",gender:"female",displayName:"Ezinne",locale:"en-NG"},{name:"en-PH-JamesNeural",gender:"male",displayName:"James",locale:"en-PH"},{name:"en-PH-RosaNeural",gender:"female",displayName:"Rosa",locale:"en-PH"},{name:"en-US-AvaNeural",gender:"female",displayName:"Ava",locale:"en-US"},{name:"en-US-AndrewNeural",gender:"male",displayName:"Andrew",locale:"en-US"},{name:"en-US-EmmaNeural",gender:"female",displayName:"Emma",locale:"en-US"},{name:"en-US-BrianNeural",gender:"male",displayName:"Brian",locale:"en-US"},{name:"en-SG-LunaNeural",gender:"female",displayName:"Luna",locale:"en-SG"},{name:"en-SG-WayneNeural",gender:"male",displayName:"Wayne",locale:"en-SG"},{name:"en-ZA-LeahNeural",gender:"female",displayName:"Leah",locale:"en-ZA"},{name:"en-ZA-LukeNeural",gender:"male",displayName:"Luke",locale:"en-ZA"},{name:"en-TZ-ElimuNeural",gender:"male",displayName:"Elimu",locale:"en-TZ"},{name:"en-TZ-ImaniNeural",gender:"female",displayName:"Imani",locale:"en-TZ"},{name:"en-GB-MaisieNeural",gender:"female",displayName:"Maisie",locale:"en-GB"},{name:"en-GB-ThomasNeural",gender:"male",displayName:"Thomas",locale:"en-GB"},{name:"en-US-AnaNeural",gender:"female",displayName:"Ana",locale:"en-US"},{name:"en-US-AndrewMultilingualNeural",gender:"male",displayName:"Andrew Multilingual",locale:"en-US"},{name:"en-US-AvaMultilingualNeural",gender:"female",displayName:"Ava Multilingual",locale:"en-US"},{name:"en-US-BrianMultilingualNeural",gender:"male",displayName:"Brian Multilingual",locale:"en-US"},{name:"en-US-EmmaMultilingualNeural",gender:"female",displayName:"Emma Multilingual",locale:"en-US"},{name:"en-US-RogerNeural",gender:"male",displayName:"Roger",locale:"en-US"},{name:"en-US-SteffanNeural",gender:"male",displayName:"Steffan",locale:"en-US"},{name:"et-EE-AnuNeural",gender:"female",displayName:"Anu",locale:"et-EE"},{name:"et-EE-KertNeural",gender:"male",displayName:"Kert",locale:"et-EE"},{name:"fil-PH-AngeloNeural",gender:"male",displayName:"Angelo",locale:"fil-PH"},{name:"fil-PH-BlessicaNeural",gender:"female",displayName:"Blessica",locale:"fil-PH"},{name:"fi-FI-HarriNeural",gender:"male",displayName:"Harri",locale:"fi-FI"},{name:"fi-FI-NooraNeural",gender:"female",displayName:"Noora",locale:"fi-FI"},{name:"fr-BE-CharlineNeural",gender:"female",displayName:"Charline",locale:"fr-BE"},{name:"fr-BE-GerardNeural",gender:"male",displayName:"Gerard",locale:"fr-BE"},{name:"fr-CA-ThierryNeural",gender:"male",displayName:"Thierry",locale:"fr-CA"},{name:"fr-CA-AntoineNeural",gender:"male",displayName:"Antoine",locale:"fr-CA"},{name:"fr-CA-JeanNeural",gender:"male",displayName:"Jean",locale:"fr-CA"},{name:"fr-CA-SylvieNeural",gender:"female",displayName:"Sylvie",locale:"fr-CA"},{name:"fr-FR-VivienneMultilingualNeural",gender:"female",displayName:"Vivienne Multilingue",locale:"fr-FR"},{name:"fr-FR-RemyMultilingualNeural",gender:"male",displayName:"Rémy Multilingue",locale:"fr-FR"},{name:"fr-FR-EloiseNeural",gender:"female",displayName:"Eloise",locale:"fr-FR"},{name:"fr-CH-ArianeNeural",gender:"female",displayName:"Ariane",locale:"fr-CH"},{name:"fr-CH-FabriceNeural",gender:"male",displayName:"Fabrice",locale:"fr-CH"},{name:"gl-ES-RoiNeural",gender:"male",displayName:"Roi",locale:"gl-ES"},{name:"gl-ES-SabelaNeural",gender:"female",displayName:"Sabela",locale:"gl-ES"},{name:"ka-GE-EkaNeural",gender:"female",displayName:"ეკა",locale:"ka-GE"},{name:"ka-GE-GiorgiNeural",gender:"male",displayName:"გიორგი",locale:"ka-GE"},{name:"de-AT-IngridNeural",gender:"female",displayName:"Ingrid",locale:"de-AT"},{name:"de-AT-JonasNeural",gender:"male",displayName:"Jonas",locale:"de-AT"},{name:"de-DE-SeraphinaMultilingualNeural",gender:"female",displayName:"Seraphine Mehrsprachig",locale:"de-DE"},{name:"de-DE-FlorianMultilingualNeural",gender:"male",displayName:"Florian Mehrsprachig",locale:"de-DE"},{name:"de-DE-KillianNeural",gender:"male",displayName:"Killian",locale:"de-DE"},{name:"de-CH-JanNeural",gender:"male",displayName:"Jan",locale:"de-CH"},{name:"de-CH-LeniNeural",gender:"female",displayName:"Leni",locale:"de-CH"},{name:"el-GR-AthinaNeural",gender:"female",displayName:"Αθηνά",locale:"el-GR"},{name:"el-GR-NestorasNeural",gender:"male",displayName:"Νέστορας",locale:"el-GR"},{name:"gu-IN-DhwaniNeural",gender:"female",displayName:"ધ્વની",locale:"gu-IN"},{name:"gu-IN-NiranjanNeural",gender:"male",displayName:"નિરંજન",locale:"gu-IN"},{name:"he-IL-AvriNeural",gender:"male",displayName:"אברי",locale:"he-IL"},{name:"he-IL-HilaNeural",gender:"female",displayName:"הילה",locale:"he-IL"},{name:"hi-IN-MadhurNeural",gender:"male",displayName:"मधुर",locale:"hi-IN"},{name:"hi-IN-SwaraNeural",gender:"female",displayName:"स्वरा",locale:"hi-IN"},{name:"hu-HU-NoemiNeural",gender:"female",displayName:"Noémi",locale:"hu-HU"},{name:"hu-HU-TamasNeural",gender:"male",displayName:"Tamás",locale:"hu-HU"},{name:"is-IS-GudrunNeural",gender:"female",displayName:"Guðrún",locale:"is-IS"},{name:"is-IS-GunnarNeural",gender:"male",displayName:"Gunnar",locale:"is-IS"},{name:"id-ID-ArdiNeural",gender:"male",displayName:"Ardi",locale:"id-ID"},{name:"id-ID-GadisNeural",gender:"female",displayName:"Gadis",locale:"id-ID"},{name:"iu-Latn-CA-SiqiniqNeural",gender:"female",displayName:"ᓯᕿᓂᖅ",locale:"iu-Latn-CA"},{name:"iu-Latn-CA-TaqqiqNeural",gender:"male",displayName:"ᑕᖅᑭᖅ",locale:"iu-Latn-CA"},{name:"iu-Cans-CA-SiqiniqNeural",gender:"female",displayName:"ᓯᕿᓂᖅ",locale:"iu-Cans-CA"},{name:"iu-Cans-CA-TaqqiqNeural",gender:"male",displayName:"ᑕᖅᑭᖅ",locale:"iu-Cans-CA"},{name:"ga-IE-ColmNeural",gender:"male",displayName:"Colm",locale:"ga-IE"},{name:"ga-IE-OrlaNeural",gender:"female",displayName:"Orla",locale:"ga-IE"},{name:"it-IT-GiuseppeMultilingualNeural",gender:"male",displayName:"Giuseppe Multilingual",locale:"it-IT"},{name:"jv-ID-DimasNeural",gender:"male",displayName:"Dimas",locale:"jv-ID"},{name:"jv-ID-SitiNeural",gender:"female",displayName:"Siti",locale:"jv-ID"},{name:"kn-IN-GaganNeural",gender:"male",displayName:"ಗಗನ್",locale:"kn-IN"},{name:"kn-IN-SapnaNeural",gender:"female",displayName:"ಸಪ್ನಾ",locale:"kn-IN"},{name:"kk-KZ-AigulNeural",gender:"female",displayName:"Айгүл",locale:"kk-KZ"},{name:"kk-KZ-DauletNeural",gender:"male",displayName:"Дәулет",locale:"kk-KZ"},{name:"km-KH-PisethNeural",gender:"male",displayName:"ពិសិដ្ឋ",locale:"km-KH"},{name:"km-KH-SreymomNeural",gender:"female",displayName:"ស្រីមុំ",locale:"km-KH"},{name:"ko-KR-HyunsuMultilingualNeural",gender:"male",displayName:"Hyunsu Multilingual",locale:"ko-KR"},{name:"lo-LA-ChanthavongNeural",gender:"male",displayName:"ຈັນທະວົງ",locale:"lo-LA"},{name:"lo-LA-KeomanyNeural",gender:"female",displayName:"ແກ້ວມະນີ",locale:"lo-LA"},{name:"lv-LV-EveritaNeural",gender:"female",displayName:"Everita",locale:"lv-LV"},{name:"lv-LV-NilsNeural",gender:"male",displayName:"Nils",locale:"lv-LV"},{name:"lt-LT-LeonasNeural",gender:"male",displayName:"Leonas",locale:"lt-LT"},{name:"lt-LT-OnaNeural",gender:"female",displayName:"Ona",locale:"lt-LT"},{name:"mk-MK-AleksandarNeural",gender:"male",displayName:"Александар",locale:"mk-MK"},{name:"mk-MK-MarijaNeural",gender:"female",displayName:"Марија",locale:"mk-MK"},{name:"ms-MY-OsmanNeural",gender:"male",displayName:"Osman",locale:"ms-MY"},{name:"ms-MY-YasminNeural",gender:"female",displayName:"Yasmin",locale:"ms-MY"},{name:"ml-IN-MidhunNeural",gender:"male",displayName:"മിഥുൻ",locale:"ml-IN"},{name:"ml-IN-SobhanaNeural",gender:"female",displayName:"ശോഭന",locale:"ml-IN"},{name:"mt-MT-GraceNeural",gender:"female",displayName:"Grace",locale:"mt-MT"},{name:"mt-MT-JosephNeural",gender:"male",displayName:"Joseph",locale:"mt-MT"},{name:"mr-IN-AarohiNeural",gender:"female",displayName:"आरोही",locale:"mr-IN"},{name:"mr-IN-ManoharNeural",gender:"male",displayName:"मनोहर",locale:"mr-IN"},{name:"mn-MN-BataaNeural",gender:"male",displayName:"Батаа",locale:"mn-MN"},{name:"mn-MN-YesuiNeural",gender:"female",displayName:"Есүй",locale:"mn-MN"},{name:"ne-NP-HemkalaNeural",gender:"female",displayName:"हेमकला",locale:"ne-NP"},{name:"ne-NP-SagarNeural",gender:"male",displayName:"सागर",locale:"ne-NP"},{name:"nb-NO-FinnNeural",gender:"male",displayName:"Finn",locale:"nb-NO"},{name:"nb-NO-PernilleNeural",gender:"female",displayName:"Pernille",locale:"nb-NO"},{name:"ps-AF-GulNawazNeural",gender:"male",displayName:" ګل نواز",locale:"ps-AF"},{name:"ps-AF-LatifaNeural",gender:"female",displayName:"لطيفه",locale:"ps-AF"},{name:"fa-IR-DilaraNeural",gender:"female",displayName:"دلارا",locale:"fa-IR"},{name:"fa-IR-FaridNeural",gender:"male",displayName:"فرید",locale:"fa-IR"},{name:"pl-PL-MarekNeural",gender:"male",displayName:"Marek",locale:"pl-PL"},{name:"pl-PL-ZofiaNeural",gender:"female",displayName:"Zofia",locale:"pl-PL"},{name:"pt-BR-ThalitaMultilingualNeural",gender:"female",displayName:"Thalita multilíngue",locale:"pt-BR"},{name:"ro-RO-AlinaNeural",gender:"female",displayName:"Alina",locale:"ro-RO"},{name:"ro-RO-EmilNeural",gender:"male",displayName:"Emil",locale:"ro-RO"},{name:"sr-RS-NicholasNeural",gender:"male",displayName:"Никола",locale:"sr-RS"},{name:"sr-RS-SophieNeural",gender:"female",displayName:"Софија",locale:"sr-RS"},{name:"si-LK-SameeraNeural",gender:"male",displayName:"සමීර",locale:"si-LK"},{name:"si-LK-ThiliniNeural",gender:"female",displayName:"තිළිණි",locale:"si-LK"},{name:"sk-SK-LukasNeural",gender:"male",displayName:"Lukáš",locale:"sk-SK"},{name:"sk-SK-ViktoriaNeural",gender:"female",displayName:"Viktória",locale:"sk-SK"},{name:"sl-SI-PetraNeural",gender:"female",displayName:"Petra",locale:"sl-SI"},{name:"sl-SI-RokNeural",gender:"male",displayName:"Rok",locale:"sl-SI"},{name:"so-SO-MuuseNeural",gender:"male",displayName:"Muuse",locale:"so-SO"},{name:"so-SO-UbaxNeural",gender:"female",displayName:"Ubax",locale:"so-SO"},{name:"es-AR-ElenaNeural",gender:"female",displayName:"Elena",locale:"es-AR"},{name:"es-AR-TomasNeural",gender:"male",displayName:"Tomas",locale:"es-AR"},{name:"es-BO-MarceloNeural",gender:"male",displayName:"Marcelo",locale:"es-BO"},{name:"es-BO-SofiaNeural",gender:"female",displayName:"Sofia",locale:"es-BO"},{name:"es-CL-CatalinaNeural",gender:"female",displayName:"Catalina",locale:"es-CL"},{name:"es-CL-LorenzoNeural",gender:"male",displayName:"Lorenzo",locale:"es-CL"},{name:"es-CO-GonzaloNeural",gender:"male",displayName:"Gonzalo",locale:"es-CO"},{name:"es-CO-SalomeNeural",gender:"female",displayName:"Salome",locale:"es-CO"},{name:"es-ES-XimenaNeural",gender:"female",displayName:"Ximena",locale:"es-ES"},{name:"es-CR-JuanNeural",gender:"male",displayName:"Juan",locale:"es-CR"},{name:"es-CR-MariaNeural",gender:"female",displayName:"María",locale:"es-CR"},{name:"es-CU-BelkysNeural",gender:"female",displayName:"Belkys",locale:"es-CU"},{name:"es-CU-ManuelNeural",gender:"male",displayName:"Manuel",locale:"es-CU"},{name:"es-DO-EmilioNeural",gender:"male",displayName:"Emilio",locale:"es-DO"},{name:"es-DO-RamonaNeural",gender:"female",displayName:"Ramona",locale:"es-DO"},{name:"es-EC-AndreaNeural",gender:"female",displayName:"Andrea",locale:"es-EC"},{name:"es-EC-LuisNeural",gender:"male",displayName:"Luis",locale:"es-EC"},{name:"es-SV-LorenaNeural",gender:"female",displayName:"Lorena",locale:"es-SV"},{name:"es-SV-RodrigoNeural",gender:"male",displayName:"Rodrigo",locale:"es-SV"},{name:"es-GQ-JavierNeural",gender:"male",displayName:"Javier",locale:"es-GQ"},{name:"es-GQ-TeresaNeural",gender:"female",displayName:"Teresa",locale:"es-GQ"},{name:"es-GT-AndresNeural",gender:"male",displayName:"Andrés",locale:"es-GT"},{name:"es-GT-MartaNeural",gender:"female",displayName:"Marta",locale:"es-GT"},{name:"es-HN-CarlosNeural",gender:"male",displayName:"Carlos",locale:"es-HN"},{name:"es-HN-KarlaNeural",gender:"female",displayName:"Karla",locale:"es-HN"},{name:"es-MX-DaliaNeural",gender:"female",displayName:"Dalia",locale:"es-MX"},{name:"es-MX-JorgeNeural",gender:"male",displayName:"Jorge",locale:"es-MX"},{name:"es-NI-FedericoNeural",gender:"male",displayName:"Federico",locale:"es-NI"},{name:"es-NI-YolandaNeural",gender:"female",displayName:"Yolanda",locale:"es-NI"},{name:"es-PA-MargaritaNeural",gender:"female",displayName:"Margarita",locale:"es-PA"},{name:"es-PA-RobertoNeural",gender:"male",displayName:"Roberto",locale:"es-PA"},{name:"es-PY-MarioNeural",gender:"male",displayName:"Mario",locale:"es-PY"},{name:"es-PY-TaniaNeural",gender:"female",displayName:"Tania",locale:"es-PY"},{name:"es-PE-AlexNeural",gender:"male",displayName:"Alex",locale:"es-PE"},{name:"es-PE-CamilaNeural",gender:"female",displayName:"Camila",locale:"es-PE"},{name:"es-PR-KarinaNeural",gender:"female",displayName:"Karina",locale:"es-PR"},{name:"es-PR-VictorNeural",gender:"male",displayName:"Víctor",locale:"es-PR"},{name:"es-US-AlonsoNeural",gender:"male",displayName:"Alonso",locale:"es-US"},{name:"es-US-PalomaNeural",gender:"female",displayName:"Paloma",locale:"es-US"},{name:"es-UY-MateoNeural",gender:"male",displayName:"Mateo",locale:"es-UY"},{name:"es-UY-ValentinaNeural",gender:"female",displayName:"Valentina",locale:"es-UY"},{name:"es-VE-PaolaNeural",gender:"female",displayName:"Paola",locale:"es-VE"},{name:"es-VE-SebastianNeural",gender:"male",displayName:"Sebastián",locale:"es-VE"},{name:"su-ID-JajangNeural",gender:"male",displayName:"Jajang",locale:"su-ID"},{name:"su-ID-TutiNeural",gender:"female",displayName:"Tuti",locale:"su-ID"},{name:"sw-KE-RafikiNeural",gender:"male",displayName:"Rafiki",locale:"sw-KE"},{name:"sw-KE-ZuriNeural",gender:"female",displayName:"Zuri",locale:"sw-KE"},{name:"sw-TZ-DaudiNeural",gender:"male",displayName:"Daudi",locale:"sw-TZ"},{name:"sw-TZ-RehemaNeural",gender:"female",displayName:"Rehema",locale:"sw-TZ"},{name:"sv-SE-MattiasNeural",gender:"male",displayName:"Mattias",locale:"sv-SE"},{name:"sv-SE-SofieNeural",gender:"female",displayName:"Sofie",locale:"sv-SE"},{name:"ta-IN-PallaviNeural",gender:"female",displayName:"பல்லவி",locale:"ta-IN"},{name:"ta-IN-ValluvarNeural",gender:"male",displayName:"வள்ளுவர்",locale:"ta-IN"},{name:"ta-MY-KaniNeural",gender:"female",displayName:"கனி",locale:"ta-MY"},{name:"ta-MY-SuryaNeural",gender:"male",displayName:"சூர்யா",locale:"ta-MY"},{name:"ta-SG-AnbuNeural",gender:"male",displayName:"அன்பு",locale:"ta-SG"},{name:"ta-SG-VenbaNeural",gender:"female",displayName:"வெண்பா",locale:"ta-SG"},{name:"ta-LK-KumarNeural",gender:"male",displayName:"குமார்",locale:"ta-LK"},{name:"ta-LK-SaranyaNeural",gender:"female",displayName:"சரண்யா",locale:"ta-LK"},{name:"te-IN-MohanNeural",gender:"male",displayName:"మోహన్",locale:"te-IN"},{name:"te-IN-ShrutiNeural",gender:"female",displayName:"శ్రుతి",locale:"te-IN"},{name:"th-TH-NiwatNeural",gender:"male",displayName:"นิวัฒน์",locale:"th-TH"},{name:"th-TH-PremwadeeNeural",gender:"female",displayName:"เปรมวดี",locale:"th-TH"},{name:"tr-TR-EmelNeural",gender:"female",displayName:"Emel",locale:"tr-TR"},{name:"tr-TR-AhmetNeural",gender:"male",displayName:"Ahmet",locale:"tr-TR"},{name:"uk-UA-OstapNeural",gender:"male",displayName:"Остап",locale:"uk-UA"},{name:"uk-UA-PolinaNeural",gender:"female",displayName:"Поліна",locale:"uk-UA"},{name:"ur-IN-GulNeural",gender:"female",displayName:"گل",locale:"ur-IN"},{name:"ur-IN-SalmanNeural",gender:"male",displayName:"سلمان",locale:"ur-IN"},{name:"ur-PK-AsadNeural",gender:"male",displayName:"اسد",locale:"ur-PK"},{name:"ur-PK-UzmaNeural",gender:"female",displayName:"عظمیٰ",locale:"ur-PK"},{name:"uz-UZ-MadinaNeural",gender:"female",displayName:"Madina",locale:"uz-UZ"},{name:"uz-UZ-SardorNeural",gender:"male",displayName:"Sardor",locale:"uz-UZ"},{name:"vi-VN-HoaiMyNeural",gender:"female",displayName:"Hoài My",locale:"vi-VN"},{name:"vi-VN-NamMinhNeural",gender:"male",displayName:"Nam Minh",locale:"vi-VN"},{name:"cy-GB-AledNeural",gender:"male",displayName:"Aled",locale:"cy-GB"},{name:"cy-GB-NiaNeural",gender:"female",displayName:"Nia",locale:"cy-GB"},{name:"zu-ZA-ThandoNeural",gender:"female",displayName:"Thando",locale:"zu-ZA"},{name:"zu-ZA-ThembaNeural",gender:"male",displayName:"Themba",locale:"zu-ZA"},{name:"as-IN-YashicaNeural",gender:"female",displayName:"যাশিকা",locale:"as-IN"},{name:"as-IN-PriyomNeural",gender:"male",displayName:"প্ৰিয়ম",locale:"as-IN"},{name:"ca-ES-AlbaNeural",gender:"female",displayName:"Alba",locale:"ca-ES"},{name:"de-DE-ChristophNeural",gender:"male",displayName:"Christoph",locale:"de-DE"},{name:"de-DE-ElkeNeural",gender:"female",displayName:"Elke",locale:"de-DE"},{name:"de-DE-GiselaNeural",gender:"female",displayName:"Gisela",locale:"de-DE"},{name:"de-DE-KasperNeural",gender:"male",displayName:"Kasper",locale:"de-DE"},{name:"de-DE-KlarissaNeural",gender:"female",displayName:"Klarissa",locale:"de-DE"},{name:"de-DE-KlausNeural",gender:"male",displayName:"Klaus",locale:"de-DE"},{name:"de-DE-LouisaNeural",gender:"female",displayName:"Louisa",locale:"de-DE"},{name:"de-DE-MajaNeural",gender:"female",displayName:"Maja",locale:"de-DE"},{name:"de-DE-RalfNeural",gender:"male",displayName:"Ralf",locale:"de-DE"},{name:"de-DE-TanjaNeural",gender:"female",displayName:"Tanja",locale:"de-DE"},{name:"en-AU-WilliamNeural",gender:"male",displayName:"William",locale:"en-AU"},{name:"en-AU-AnnetteNeural",gender:"female",displayName:"Annette",locale:"en-AU"},{name:"en-AU-CarlyNeural",gender:"female",displayName:"Carly",locale:"en-AU"},{name:"en-AU-DarrenNeural",gender:"male",displayName:"Darren",locale:"en-AU"},{name:"en-AU-DuncanNeural",gender:"male",displayName:"Duncan",locale:"en-AU"},{name:"en-AU-ElsieNeural",gender:"female",displayName:"Elsie",locale:"en-AU"},{name:"en-AU-FreyaNeural",gender:"female",displayName:"Freya",locale:"en-AU"},{name:"en-AU-JoanneNeural",gender:"female",displayName:"Joanne",locale:"en-AU"},{name:"en-AU-KenNeural",gender:"male",displayName:"Ken",locale:"en-AU"},{name:"en-AU-KimNeural",gender:"female",displayName:"Kim",locale:"en-AU"},{name:"en-AU-NeilNeural",gender:"male",displayName:"Neil",locale:"en-AU"},{name:"en-AU-TimNeural",gender:"male",displayName:"Tim",locale:"en-AU"},{name:"en-AU-TinaNeural",gender:"female",displayName:"Tina",locale:"en-AU"},{name:"en-GB-AdaMultilingualNeural",gender:"female",displayName:"Ada Multilingual",locale:"en-GB"},{name:"en-GB-OllieMultilingualNeural",gender:"male",displayName:"Ollie Multilingual",locale:"en-GB"},{name:"en-GB-AbbiNeural",gender:"female",displayName:"Abbi",locale:"en-GB"},{name:"en-GB-AlfieNeural",gender:"male",displayName:"Alfie",locale:"en-GB"},{name:"en-GB-BellaNeural",gender:"female",displayName:"Bella",locale:"en-GB"},{name:"en-GB-ElliotNeural",gender:"male",displayName:"Elliot",locale:"en-GB"},{name:"en-GB-EthanNeural",gender:"male",displayName:"Ethan",locale:"en-GB"},{name:"en-GB-HollieNeural",gender:"female",displayName:"Hollie",locale:"en-GB"},{name:"en-GB-NoahNeural",gender:"male",displayName:"Noah",locale:"en-GB"},{name:"en-GB-OliverNeural",gender:"male",displayName:"Oliver",locale:"en-GB"},{name:"en-GB-OliviaNeural",gender:"female",displayName:"Olivia",locale:"en-GB"},{name:"en-GB-MiaNeural",gender:"female",displayName:"Mia",locale:"en-GB"},{name:"en-IN-AartiIndicNeural",gender:"female",displayName:"Aarti Indic",locale:"en-IN"},{name:"en-IN-ArjunIndicNeural",gender:"male",displayName:"Arjun Indic",locale:"en-IN"},{name:"en-IN-NeerjaIndicNeural",gender:"female",displayName:"Neerja Indic",locale:"en-IN"},{name:"en-IN-PrabhatIndicNeural",gender:"male",displayName:"Prabhat Indic",locale:"en-IN"},{name:"en-IN-AaravNeural",gender:"male",displayName:"Aarav",locale:"en-IN"},{name:"en-IN-AashiNeural",gender:"female",displayName:"Aashi",locale:"en-IN"},{name:"en-IN-AartiNeural",gender:"female",displayName:"Aarti",locale:"en-IN"},{name:"en-IN-ArjunNeural",gender:"male",displayName:"Arjun",locale:"en-IN"},{name:"en-IN-AnanyaNeural",gender:"female",displayName:"Ananya",locale:"en-IN"},{name:"en-IN-KavyaNeural",gender:"female",displayName:"Kavya",locale:"en-IN"},{name:"en-IN-KunalNeural",gender:"male",displayName:"Kunal",locale:"en-IN"},{name:"en-IN-RehaanNeural",gender:"male",displayName:"Rehaan",locale:"en-IN"},{name:"en-US-AmandaMultilingualNeural",gender:"female",displayName:"Amanda Multilingual",locale:"en-US"},{name:"en-US-AdamMultilingualNeural",gender:"male",displayName:"Adam Multilingual",locale:"en-US"},{name:"en-US-PhoebeMultilingualNeural",gender:"female",displayName:"Phoebe Multilingual",locale:"en-US"},{name:"en-US-AlloyTurboMultilingualNeural",gender:"male",displayName:"Alloy Turbo Multilingual",locale:"en-US"},{name:"en-US-EchoTurboMultilingualNeural",gender:"male",displayName:"Echo Turbo Multilingual",locale:"en-US"},{name:"en-US-FableTurboMultilingualNeural",gender:"female",displayName:"Fable Turbo Multilingual",locale:"en-US"},{name:"en-US-OnyxTurboMultilingualNeural",gender:"male",displayName:"Onyx Turbo Multilingual",locale:"en-US"},{name:"en-US-NovaTurboMultilingualNeural",gender:"female",displayName:"Nova Turbo Multilingual",locale:"en-US"},{name:"en-US-ShimmerTurboMultilingualNeural",gender:"female",displayName:"Shimmer Turbo Multilingual",locale:"en-US"},{name:"en-US-JasonNeural",gender:"male",displayName:"Jason",locale:"en-US"},{name:"en-US-KaiNeural",gender:"male",displayName:"Kai",locale:"en-US"},{name:"en-US-LunaNeural",gender:"female",displayName:"Luna",locale:"en-US"},{name:"en-US-TonyNeural",gender:"male",displayName:"Tony",locale:"en-US"},{name:"en-US-NancyNeural",gender:"female",displayName:"Nancy",locale:"en-US"},{name:"en-US-CoraMultilingualNeural",gender:"female",displayName:"Cora Multilingual",locale:"en-US"},{name:"en-US-ChristopherMultilingualNeural",gender:"male",displayName:"Christopher Multilingual",locale:"en-US"},{name:"en-US-BrandonMultilingualNeural",gender:"male",displayName:"Brandon Multilingual",locale:"en-US"},{name:"en-US-AshleyNeural",gender:"female",displayName:"Ashley",locale:"en-US"},{name:"en-US-BrandonNeural",gender:"male",displayName:"Brandon",locale:"en-US"},{name:"en-US-CoraNeural",gender:"female",displayName:"Cora",locale:"en-US"},{name:"en-US-DavisMultilingualNeural",gender:"male",displayName:"Davis Multilingual",locale:"en-US"},{name:"en-US-DerekMultilingualNeural",gender:"male",displayName:"Derek Multilingual",locale:"en-US"},{name:"en-US-DustinMultilingualNeural",gender:"male",displayName:"Dustin Multilingual",locale:"en-US"},{name:"en-US-ElizabethNeural",gender:"female",displayName:"Elizabeth",locale:"en-US"},{name:"en-US-JacobNeural",gender:"male",displayName:"Jacob",locale:"en-US"},{name:"en-US-JennyMultilingualNeural",gender:"female",displayName:"Jenny Multilingual",locale:"en-US"},{name:"en-US-LewisMultilingualNeural",gender:"male",displayName:"Lewis Multilingual",locale:"en-US"},{name:"en-US-LolaMultilingualNeural",gender:"female",displayName:"Lola Multilingual",locale:"en-US"},{name:"en-US-MonicaNeural",gender:"female",displayName:"Monica",locale:"en-US"},{name:"en-US-NancyMultilingualNeural",gender:"female",displayName:"Nancy Multilingual",locale:"en-US"},{name:"en-US-RyanMultilingualNeural",gender:"male",displayName:"Ryan Multilingual",locale:"en-US"},{name:"en-US-SamuelMultilingualNeural",gender:"male",displayName:"Samuel Multilingual",locale:"en-US"},{name:"en-US-SerenaMultilingualNeural",gender:"female",displayName:"Serena Multilingual",locale:"en-US"},{name:"en-US-SteffanMultilingualNeural",gender:"male",displayName:"Steffan Multilingual",locale:"en-US"},{name:"en-US-AIGenerate1Neural",gender:"male",displayName:"AIGenerate1",locale:"en-US"},{name:"en-US-AIGenerate2Neural",gender:"female",displayName:"AIGenerate2",locale:"en-US"},{name:"en-US-AshTurboMultilingualNeural",gender:"male",displayName:"Ash Turbo Multilingual",locale:"en-US"},{name:"en-US-BlueNeural",gender:"female",displayName:"Blue",locale:"en-US"},{name:"en-US-EvelynMultilingualNeural",gender:"female",displayName:"Evelyn Multilingual",locale:"en-US"},{name:"es-ES-ArabellaMultilingualNeural",gender:"female",displayName:"Arabella Multilingual",locale:"es-ES"},{name:"es-ES-IsidoraMultilingualNeural",gender:"female",displayName:"Isidora Multilingual",locale:"es-ES"},{name:"es-ES-TristanMultilingualNeural",gender:"male",displayName:"Tristan Multilingual",locale:"es-ES"},{name:"es-ES-XimenaMultilingualNeural",gender:"female",displayName:"Ximena Multilingual",locale:"es-ES"},{name:"es-ES-DarioNeural",gender:"male",displayName:"Dario",locale:"es-ES"},{name:"es-ES-EliasNeural",gender:"male",displayName:"Elias",locale:"es-ES"},{name:"es-ES-EstrellaNeural",gender:"female",displayName:"Estrella",locale:"es-ES"},{name:"es-ES-IreneNeural",gender:"female",displayName:"Irene",locale:"es-ES"},{name:"es-ES-LaiaNeural",gender:"female",displayName:"Laia",locale:"es-ES"},{name:"es-ES-LiaNeural",gender:"female",displayName:"Lia",locale:"es-ES"},{name:"es-ES-NilNeural",gender:"male",displayName:"Nil",locale:"es-ES"},{name:"es-ES-SaulNeural",gender:"male",displayName:"Saul",locale:"es-ES"},{name:"es-ES-TeoNeural",gender:"male",displayName:"Teo",locale:"es-ES"},{name:"es-ES-TrianaNeural",gender:"female",displayName:"Triana",locale:"es-ES"},{name:"es-ES-VeraNeural",gender:"female",displayName:"Vera",locale:"es-ES"},{name:"es-MX-DaliaMultilingualNeural",gender:"female",displayName:"Dalia Multilingual",locale:"es-MX"},{name:"es-MX-JorgeMultilingualNeural",gender:"male",displayName:"Jorge Multilingual",locale:"es-MX"},{name:"es-MX-BeatrizNeural",gender:"female",displayName:"Beatriz",locale:"es-MX"},{name:"es-MX-CandelaNeural",gender:"female",displayName:"Candela",locale:"es-MX"},{name:"es-MX-CarlotaNeural",gender:"female",displayName:"Carlota",locale:"es-MX"},{name:"es-MX-CecilioNeural",gender:"male",displayName:"Cecilio",locale:"es-MX"},{name:"es-MX-GerardoNeural",gender:"male",displayName:"Gerardo",locale:"es-MX"},{name:"es-MX-LarissaNeural",gender:"female",displayName:"Larissa",locale:"es-MX"},{name:"es-MX-LibertoNeural",gender:"male",displayName:"Liberto",locale:"es-MX"},{name:"es-MX-LucianoNeural",gender:"male",displayName:"Luciano",locale:"es-MX"},{name:"es-MX-MarinaNeural",gender:"female",displayName:"Marina",locale:"es-MX"},{name:"es-MX-NuriaNeural",gender:"female",displayName:"Nuria",locale:"es-MX"},{name:"es-MX-PelayoNeural",gender:"male",displayName:"Pelayo",locale:"es-MX"},{name:"es-MX-RenataNeural",gender:"female",displayName:"Renata",locale:"es-MX"},{name:"es-MX-YagoNeural",gender:"male",displayName:"Yago",locale:"es-MX"},{name:"eu-ES-AinhoaNeural",gender:"female",displayName:"Ainhoa",locale:"eu-ES"},{name:"eu-ES-AnderNeural",gender:"male",displayName:"Ander",locale:"eu-ES"},{name:"fi-FI-SelmaNeural",gender:"female",displayName:"Selma",locale:"fi-FI"},{name:"fr-FR-LucienMultilingualNeural",gender:"male",displayName:"Lucien Multilingual",locale:"fr-FR"},{name:"fr-FR-AlainNeural",gender:"male",displayName:"Alain",locale:"fr-FR"},{name:"fr-FR-BrigitteNeural",gender:"female",displayName:"Brigitte",locale:"fr-FR"},{name:"fr-FR-CelesteNeural",gender:"female",displayName:"Celeste",locale:"fr-FR"},{name:"fr-FR-ClaudeNeural",gender:"male",displayName:"Claude",locale:"fr-FR"},{name:"fr-FR-CoralieNeural",gender:"female",displayName:"Coralie",locale:"fr-FR"},{name:"fr-FR-JacquelineNeural",gender:"female",displayName:"Jacqueline",locale:"fr-FR"},{name:"fr-FR-JeromeNeural",gender:"male",displayName:"Jerome",locale:"fr-FR"},{name:"fr-FR-JosephineNeural",gender:"female",displayName:"Josephine",locale:"fr-FR"},{name:"fr-FR-MauriceNeural",gender:"male",displayName:"Maurice",locale:"fr-FR"},{name:"fr-FR-YvesNeural",gender:"male",displayName:"Yves",locale:"fr-FR"},{name:"fr-FR-YvetteNeural",gender:"female",displayName:"Yvette",locale:"fr-FR"},{name:"hi-IN-AaravNeural",gender:"male",displayName:"आरव ",locale:"hi-IN"},{name:"hi-IN-AnanyaNeural",gender:"female",displayName:"अनन्या",locale:"hi-IN"},{name:"hi-IN-AartiNeural",gender:"female",displayName:"आरती",locale:"hi-IN"},{name:"hi-IN-ArjunNeural",gender:"male",displayName:"अर्जुन",locale:"hi-IN"},{name:"hi-IN-KavyaNeural",gender:"female",displayName:"काव्या",locale:"hi-IN"},{name:"hi-IN-KunalNeural",gender:"male",displayName:"कुनाल ",locale:"hi-IN"},{name:"hi-IN-RehaanNeural",gender:"male",displayName:"रेहान",locale:"hi-IN"},{name:"hy-AM-AnahitNeural",gender:"female",displayName:"Անահիտ",locale:"hy-AM"},{name:"hy-AM-HaykNeural",gender:"male",displayName:"Հայկ",locale:"hy-AM"},{name:"it-IT-AlessioMultilingualNeural",gender:"male",displayName:"Alessio Multilingual",locale:"it-IT"},{name:"it-IT-IsabellaMultilingualNeural",gender:"female",displayName:"Isabella Multilingual",locale:"it-IT"},{name:"it-IT-MarcelloMultilingualNeural",gender:"male",displayName:"Marcello Multilingual",locale:"it-IT"},{name:"it-IT-CalimeroNeural",gender:"male",displayName:"Calimero",locale:"it-IT"},{name:"it-IT-CataldoNeural",gender:"male",displayName:"Cataldo",locale:"it-IT"},{name:"it-IT-FabiolaNeural",gender:"female",displayName:"Fabiola",locale:"it-IT"},{name:"it-IT-FiammaNeural",gender:"female",displayName:"Fiamma",locale:"it-IT"},{name:"it-IT-GianniNeural",gender:"male",displayName:"Gianni",locale:"it-IT"},{name:"it-IT-GiuseppeNeural",gender:"male",displayName:"Giuseppe",locale:"it-IT"},{name:"it-IT-ImeldaNeural",gender:"female",displayName:"Imelda",locale:"it-IT"},{name:"it-IT-IrmaNeural",gender:"female",displayName:"Irma",locale:"it-IT"},{name:"it-IT-LisandroNeural",gender:"male",displayName:"Lisandro",locale:"it-IT"},{name:"it-IT-PalmiraNeural",gender:"female",displayName:"Palmira",locale:"it-IT"},{name:"it-IT-PierinaNeural",gender:"female",displayName:"Pierina",locale:"it-IT"},{name:"it-IT-RinaldoNeural",gender:"male",displayName:"Rinaldo",locale:"it-IT"},{name:"ja-JP-AoiNeural",gender:"female",displayName:"碧衣",locale:"ja-JP"},{name:"ja-JP-DaichiNeural",gender:"male",displayName:"大智",locale:"ja-JP"},{name:"ja-JP-MayuNeural",gender:"female",displayName:"真夕",locale:"ja-JP"},{name:"ja-JP-NaokiNeural",gender:"male",displayName:"直紀",locale:"ja-JP"},{name:"ja-JP-ShioriNeural",gender:"female",displayName:"志織",locale:"ja-JP"},{name:"ja-JP-MasaruMultilingualNeural",gender:"male",displayName:"勝 多言語",locale:"ja-JP"},{name:"ko-KR-BongJinNeural",gender:"male",displayName:"봉진",locale:"ko-KR"},{name:"ko-KR-GookMinNeural",gender:"male",displayName:"국민",locale:"ko-KR"},{name:"ko-KR-HyunsuNeural",gender:"male",displayName:"현수",locale:"ko-KR"},{name:"ko-KR-JiMinNeural",gender:"female",displayName:"지민",locale:"ko-KR"},{name:"ko-KR-SeoHyeonNeural",gender:"female",displayName:"서현",locale:"ko-KR"},{name:"ko-KR-YuJinNeural",gender:"female",displayName:"유진",locale:"ko-KR"},{name:"nb-NO-IselinNeural",gender:"female",displayName:"Iselin",locale:"nb-NO"},{name:"or-IN-SubhasiniNeural",gender:"female",displayName:"ସୁଭାସିନୀ",locale:"or-IN"},{name:"or-IN-SukantNeural",gender:"male",displayName:"ସୁକାନ୍ତ",locale:"or-IN"},{name:"pa-IN-OjasNeural",gender:"male",displayName:"ਓਜਸ",locale:"pa-IN"},{name:"pa-IN-VaaniNeural",gender:"female",displayName:"ਵਾਨੀ",locale:"pa-IN"},{name:"pl-PL-AgnieszkaNeural",gender:"female",displayName:"Agnieszka",locale:"pl-PL"},{name:"pt-BR-MacerioMultilingualNeural",gender:"male",displayName:"Macerio Multilingual",locale:"pt-BR"},{name:"pt-BR-BrendaNeural",gender:"female",displayName:"Brenda",locale:"pt-BR"},{name:"pt-BR-DonatoNeural",gender:"male",displayName:"Donato",locale:"pt-BR"},{name:"pt-BR-ElzaNeural",gender:"female",displayName:"Elza",locale:"pt-BR"},{name:"pt-BR-FabioNeural",gender:"male",displayName:"Fabio",locale:"pt-BR"},{name:"pt-BR-GiovannaNeural",gender:"female",displayName:"Giovanna",locale:"pt-BR"},{name:"pt-BR-HumbertoNeural",gender:"male",displayName:"Humberto",locale:"pt-BR"},{name:"pt-BR-JulioNeural",gender:"male",displayName:"Julio",locale:"pt-BR"},{name:"pt-BR-LeilaNeural",gender:"female",displayName:"Leila",locale:"pt-BR"},{name:"pt-BR-LeticiaNeural",gender:"female",displayName:"Leticia",locale:"pt-BR"},{name:"pt-BR-ManuelaNeural",gender:"female",displayName:"Manuela",locale:"pt-BR"},{name:"pt-BR-NicolauNeural",gender:"male",displayName:"Nicolau",locale:"pt-BR"},{name:"pt-BR-ThalitaNeural",gender:"female",displayName:"Thalita",locale:"pt-BR"},{name:"pt-BR-ValerioNeural",gender:"male",displayName:"Valerio",locale:"pt-BR"},{name:"pt-BR-YaraNeural",gender:"female",displayName:"Yara",locale:"pt-BR"},{name:"pt-PT-FernandaNeural",gender:"female",displayName:"Fernanda",locale:"pt-PT"},{name:"sr-Latn-RS-NicholasNeural",gender:"male",displayName:"Nicholas",locale:"sr-Latn-RS"},{name:"sr-Latn-RS-SophieNeural",gender:"female",displayName:"Sophie",locale:"sr-Latn-RS"},{name:"sv-SE-HilleviNeural",gender:"female",displayName:"Hillevi",locale:"sv-SE"},{name:"th-TH-AcharaNeural",gender:"female",displayName:"อัจฉรา",locale:"th-TH"},{name:"wuu-CN-XiaotongNeural",gender:"female",displayName:"晓彤",locale:"wuu-CN"},{name:"wuu-CN-YunzheNeural",gender:"male",displayName:"云哲",locale:"wuu-CN"},{name:"zh-CN-XiaochenNeural",gender:"female",displayName:"晓辰",locale:"zh-CN"},{name:"zh-CN-XiaochenMultilingualNeural",gender:"female",displayName:"晓辰 多语言",locale:"zh-CN"},{name:"zh-CN-XiaohanNeural",gender:"female",displayName:"晓涵",locale:"zh-CN"},{name:"zh-CN-XiaomengNeural",gender:"female",displayName:"晓梦",locale:"zh-CN"},{name:"zh-CN-XiaomoNeural",gender:"female",displayName:"晓墨",locale:"zh-CN"},{name:"zh-CN-XiaoqiuNeural",gender:"female",displayName:"晓秋",locale:"zh-CN"},{name:"zh-CN-XiaorouNeural",gender:"female",displayName:"晓柔",locale:"zh-CN"},{name:"zh-CN-XiaoruiNeural",gender:"female",displayName:"晓睿",locale:"zh-CN"},{name:"zh-CN-XiaoshuangNeural",gender:"female",displayName:"晓双",locale:"zh-CN"},{name:"zh-CN-XiaoxiaoDialectsNeural",gender:"female",displayName:"晓晓 ",locale:"zh-CN"},{name:"zh-CN-XiaoxiaoMultilingualNeural",gender:"female",displayName:"晓晓 多语言",locale:"zh-CN"},{name:"zh-CN-XiaoyanNeural",gender:"female",displayName:"晓颜",locale:"zh-CN"},{name:"zh-CN-XiaoyouNeural",gender:"female",displayName:"晓悠",locale:"zh-CN"},{name:"zh-CN-XiaoyuMultilingualNeural",gender:"female",displayName:"晓宇 多语言",locale:"zh-CN"},{name:"zh-CN-XiaozhenNeural",gender:"female",displayName:"晓甄",locale:"zh-CN"},{name:"zh-CN-YunfengNeural",gender:"male",displayName:"云枫",locale:"zh-CN"},{name:"zh-CN-YunhaoNeural",gender:"male",displayName:"云皓",locale:"zh-CN"},{name:"zh-CN-YunjieNeural",gender:"male",displayName:"云杰",locale:"zh-CN"},{name:"zh-CN-YunxiaoMultilingualNeural",gender:"male",displayName:"云霄 多语言",locale:"zh-CN"},{name:"zh-CN-YunyeNeural",gender:"male",displayName:"云野",locale:"zh-CN"},{name:"zh-CN-YunyiMultilingualNeural",gender:"male",displayName:"云逸 多语言",locale:"zh-CN"},{name:"zh-CN-YunzeNeural",gender:"male",displayName:"云泽",locale:"zh-CN"},{name:"zh-CN-YunfanMultilingualNeural",gender:"male",displayName:"云帆 多语言",locale:"zh-CN"},{name:"zh-CN-guangxi-YunqiNeural",gender:"male",displayName:"云奇 广西",locale:"zh-CN"},{name:"zh-CN-henan-YundengNeural",gender:"male",displayName:"云登 河南",locale:"zh-CN"},{name:"zh-CN-liaoning-YunbiaoNeural",gender:"male",displayName:"云彪 辽宁",locale:"zh-CN"},{name:"zh-CN-shandong-YunxiangNeural",gender:"male",displayName:"云翔 山东",locale:"zh-CN"},{name:"zh-CN-sichuan-YunxiNeural",gender:"male",displayName:"云希 四川",locale:"zh-CN"}],SelfHostedVoiceList:["de-DE-AmalaNeural","de-DE-BerndNeural","de-DE-ConradNeural","de-DE-KatjaNeural","en-GB-LibbyNeural","en-GB-RyanNeural","en-GB-SoniaNeural","en-US-AmberNeural","en-US-AriaNeural","en-US-ChristopherNeural","en-US-DavisNeural","en-US-EricNeural","en-US-GuyNeural","en-US-JaneNeural","en-US-JennyNeural","en-US-MichelleNeural","en-US-SaraNeural","es-ES-AbrilNeural","es-ES-AlvaroNeural","es-ES-ArnauNeural","es-ES-ElviraNeural","fr-FR-DeniseNeural","fr-FR-HenriNeural","it-IT-BenignoNeural","it-IT-DiegoNeural","it-IT-ElsaNeural","it-IT-IsabellaNeural","ja-JP-KeitaNeural","ja-JP-NanamiNeural","ko-KR-InJoonNeural","ko-KR-SoonBokNeural","ko-KR-SunHiNeural","pt-BR-AntonioNeural","pt-BR-FranciscaNeural","pt-PT-DuarteNeural","pt-PT-RaquelNeural","ru-RU-DariyaNeural","ru-RU-DmitryNeural","ru-RU-SvetlanaNeural","yue-CN-XiaoMinNeural","yue-CN-YunSongNeural","zh-CN-henan-YundengNeural","zh-CN-liaoning-XiaobeiNeural","zh-CN-shaanxi-XiaoniNeural","zh-CN-shandong-YunxiangNeural","zh-CN-sichuan-YunxiNeural","zh-CN-XiaoxiaoNeural","zh-CN-YunxiNeural","zh-HK-HiuMaanNeural","zh-HK-WanLungNeural","zh-TW-HsiaoChenNeural","zh-TW-YunJheNeural","zf_xiaoxiao","zm_yunxi","zf_xiaoni","zf_xiaobei"],CloudDictList:[{id:"basic-english-irish",name:"Basic English-Irish Dictionary",translation:"简明英爱词典",source:"Pat Griffin"},{id:"english-italian",name:"English-Italian Dictionary",translation:"简明英意词典",source:"Pat Griffin"},{id:"cc-cedict",name:"CC-CEDICT",translation:"简明中英词典",source:"www.mdbg.net"},{id:"et-tedict",name:"ET-TEDICT",translation:"简明中英英中词典",source:"cdict-1.0-1.i386.rpm"},{id:"jmdict",name:"Japanese English Dictionary",translation:"简明日英词典",source:"JMDict"},{id:"moby",name:"Moby Thesaurus",translation:"Moby Thesaurus",source:"Chua Welic"},{id:"wordnet",name:"Wordnet",translation:"Wordnet",source:"Chua Welic"},{id:"opted",name:"Online Plain Text English Dictionary",translation:"简明英英词典",source:"Chua Welic"},{id:"english-arabic",name:"English-Arabic Dictionary",translation:"简明英阿词典",source:"Khaldoun Mahmoud"},{id:"tcm_textbook",name:"中医教材仓库",translation:"中医教材仓库",source:"Fredrik Jornebo"},{id:"ecdict",name:"ECDICT",translation:"简明英汉字典增强版",source:"GitHub-skywind3000"}]};class x{constructor(e){this.config=e,this.driveId="",this.taskQueue=new k(1),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getDriveId(){return m(this,void 0,void 0,(function*(){if(this.driveId)return this.driveId;const a=this.config.access_token,t=yield e.post("https://openapi.alipan.com/adrive/v1.0/user/getDriveInfo",{},{headers:{Authorization:`Bearer ${a}`}});return this.driveId=t.data.default_drive_id,this.driveId}))}getFolderIdByPath(a){return m(this,void 0,void 0,(function*(){const t=this.config.access_token,o=yield this.getDriveId();try{try{const i=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(i.data)return i.data.file_id}catch(i){const n=a.split("/").filter((e=>e));let r="",l="root";for(const a of n){r+="/"+a;try{l=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:r},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id}catch(i){l=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:o,parent_file_id:l,name:a,type:"folder",check_name_mode:"refuse"},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id}}return l}}catch(e){return console.error("Error getting/creating folder by path:",e),""}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=yield this.getDriveId(),i=yield this.getFolderIdByPath(this.baseFolder+"/"+a);let n=[],r="",l=!0;for(;l;){const a=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/list",{drive_id:o,parent_file_id:i,marker:r||void 0},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}),s=a.data.items.filter((e=>!e.punish_flag||2!==e.punish_flag))||[];n=n.concat(s),r=a.data.next_marker,l=!!r}return[...new Set(n.map((e=>({name:e.name,size:e.size,type:e.type,modified:e.updated_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=yield this.getDriveId(),i=yield this.getFolderIdByPath(this.baseFolder+"/"+a);return!i||(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/delete",{drive_id:o,file_id:i},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}checkExists(a){var t;return m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=yield this.getDriveId(),n=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:i,file_path:a},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}});(null===(t=n.data)||void 0===t?void 0:t.file_id)&&(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/recyclebin/trash",{drive_id:i,file_id:n.data.file_id},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}))}catch(e){}}))}getAuthUrl(e){return`https://openapi.alipan.com/oauth/authorize?${new URLSearchParams({response_type:"code",client_id:C.adriveClientId,redirect_uri:e,grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}).toString()}`}}class I extends x{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=yield this.getDriveId(),n=t.substring(0,t.lastIndexOf("/")),r=t.substring(t.lastIndexOf("/")+1);yield this.deleteFileWithoutQueue(t);const l=yield this.getFolderIdByPath(this.baseFolder+"/"+n),s=yield a.arrayBuffer(),d=s.byteLength,c=yield crypto.subtle.digest("SHA-1",s),u=Array.from(new Uint8Array(c)).map((e=>e.toString(16).padStart(2,"0"))).join(""),m=(e=>{function a(e,a){const t=(65535&e)+(65535&a);return(e>>16)+(a>>16)+(t>>16)<<16|65535&t}function t(e,t,o,i,n,r){return a((l=a(a(t,e),a(i,r)))<<(s=n)|l>>>32-s,o);var l,s}function o(e,a,o,i,n,r,l){return t(a&o|~a&i,e,a,n,r,l)}function i(e,a,o,i,n,r,l){return t(a&i|o&~i,e,a,n,r,l)}function n(e,a,o,i,n,r,l){return t(a^o^i,e,a,n,r,l)}function r(e,a,o,i,n,r,l){return t(o^(a|~i),e,a,n,r,l)}const l=function(e){const a=e.length,t=1+(a+8>>6),o=new Array(16*t).fill(0);for(let t=0;t>2]|=e.charCodeAt(t)<>2]|=128<{let a="";for(let t=0;t<4;t++)a+=("0"+(e>>8*t&255).toString(16)).slice(-2);return a})).join("")})(o),p=Number(BigInt("0x"+m.slice(0,16))%BigInt(d||1)),h=new Uint8Array(s.slice(p,Math.min(p+8,d))),g=btoa(String.fromCharCode(...h)),f=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:i,parent_file_id:l,name:r,type:"file",check_name_mode:"ignore",size:d,content_hash:u,content_hash_name:"sha1",proof_code:g,proof_version:"v1",part_info_list:[{part_number:1}]},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}),{file_id:y,upload_id:N,rapid_upload:v,part_info_list:b}=f.data;return v?(console.info("阿里云盘秒传成功"),!0):(yield fetch(b[0].upload_url,{method:"PUT",body:s,headers:{"Content-Length":d.toString()}}),yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/complete",{drive_id:i,file_id:y,upload_id:N},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=yield this.getDriveId(),i=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:this.baseFolder+"/"+a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id,n=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/getDownloadUrl",{drive_id:o,file_id:i},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return(yield e.get(n.data.url,{responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}})).data}catch(e){return console.error("Error downloading file:",e),!1}}))))))}}class F{constructor(e){this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getFolderIdByPath(a){return m(this,void 0,void 0,(function*(){if(""==a)return"0";const t=this.config.access_token,o=a.split("/");let i="0";for(const a of o){const o=`https://api.box.com/2.0/folders/${i}/items?fields=id,name&type=folder&limit=1000`;try{const n=(yield e.get(o,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===a&&"folder"===e.type));if(n)i=n.id;else{const o={name:a,parent:{id:i},type:"folder"};i=(yield e.post("https://api.box.com/2.0/folders",o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.id}}catch(e){return console.error("Error occurred during folder creation:",e),""}}return i}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);let i=yield this.getFolderIdByPath(o),n=[],r=0,l=!0;const s=1e3;for(;l;){const a=yield e.get(`https://api.box.com/2.0/folders/${i}/items`,{params:{limit:s,offset:r},headers:{Authorization:`Bearer ${t}`}}),o=a.data.entries||[];n=n.concat(o),r+=o.length,l=o.length===s&&a.data.total_count>r}return[...new Set(n.map((e=>({name:e.name,size:e.size||0,type:e.type,modified:e.content_modified_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=a.substring(0,a.lastIndexOf("/")),i=a.substring(a.lastIndexOf("/")+1);let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const r=yield this.getFolderIdByPath(n);if(!r)return!0;const l=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=file&limit=1000`,s=(yield e.get(l,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===i&&"file"===e.type));return!s||(yield e.delete(`https://api.box.com/2.0/files/${s.id}`,{headers:{Authorization:`Bearer ${t}`}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://account.box.com/api/oauth2/authorize?${new URLSearchParams({response_type:"code",client_id:C.boxClientId,redirect_uri:e,grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}).toString()}`}}class R extends F{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=t.substring(0,t.lastIndexOf("/")),n=t.substring(t.lastIndexOf("/")+1);let r=this.baseFolder+"/"+i;for(;r.startsWith("/");)r=r.substring(1);const l=yield this.getFolderIdByPath(r);if(!l)throw new Error("Folder not found");const s=(yield this.listFiles(i)).find((e=>e===n));s&&(yield this.deleteFileWithoutQueue(i+"/"+n));let d=new File([a],n,{lastModified:(new Date).getTime(),type:a.type});const c=new FormData;c.append("file",d),c.append("parent_id",l);const u=yield e.post("https://upload.box.com/api/2.0/files/content",c,{headers:{Authorization:`Bearer ${o}`,"Content-Type":"multipart/form-data"},params:{if_match:"false",fields:"name,id"},maxContentLength:1/0,maxBodyLength:1/0});return!(u.status>=300)||(console.error("Error occurred during file upload:",u),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=a.substring(0,a.lastIndexOf("/")),i=a.substring(a.lastIndexOf("/")+1);let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const r=yield this.getFolderIdByPath(n);if(!r)return console.error("Folder not found"),!0;const l=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=file&limit=1000`,s=(yield e.get(l,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===i&&"file"===e.type));if(!s)return console.error("File not found:",i),!0;const d=yield e({url:`https://api.box.com/2.0/files/${s.id}/content`,method:"get",headers:{Authorization:`Bearer ${t}`},responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return d.status>=300?(console.error("Error occurred during file download:",d),!1):d.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class O{constructor(e){this.config=e,this.taskQueue=new k(3)}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=[],i=!0,n=null;for(;i;){let r;r=n?yield e.post("https://api.dropboxapi.com/2/files/list_folder/continue",{cursor:n},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}):yield e.post("https://api.dropboxapi.com/2/files/list_folder",{path:"/"+a,limit:2e3},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});const l=r.data.entries||[];o=o.concat(l),i=r.data.has_more,n=r.data.cursor}return[...new Set(o.map((e=>({name:e.name,size:e.size||0,type:e[".tag"],modified:e.client_modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;yield e.post("https://api.dropboxapi.com/2/files/delete_v2",{path:"/"+a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://www.dropbox.com/oauth2/authorize?response_type=code&token_access_type=offline&client_id=${C.dropboxClientId}&redirect_uri=${e}`}}class _ extends O{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type});const r=yield e.post("https://content.dropboxapi.com/2/files/upload",n,{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/octet-stream","Dropbox-API-Arg":JSON.stringify({path:"/"+t,mode:"overwrite",autorename:!0,mute:!1})},maxContentLength:1/0,maxBodyLength:1/0});return!(r.status>=300)||(console.error("Error occurred during file upload:",r),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=yield e({url:"https://content.dropboxapi.com/2/files/download",method:"post",headers:{Authorization:`Bearer ${t}`,"Dropbox-API-Arg":JSON.stringify({path:"/"+a})},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return o.status>=300?(console.error("Error occurred during file download:",o),!1):o.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ${constructor(e){this.folderExistsCache=new Set,this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){var t,o;return m(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);let n=[],r=0;const l=1e3;let s=!0;for(;s;){const d=yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:a?`/${a}`:"/",limit:l,offset:r,fields:"_embedded.items.name,_embedded.items.size,_embedded.items.type,_embedded.items.modified,_embedded.total"}}),c=(null===(t=d.data._embedded)||void 0===t?void 0:t.items)||[];n=n.concat(c);const u=(null===(o=d.data._embedded)||void 0===o?void 0:o.total)||0;r+=c.length,s=r({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);const o=yield e.delete("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${t}`,"Content-Type":"application/json"},params:{path:a?`/${a}`:"/",permanently:!1}});return 202===o.status||204===o.status}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(a){var t,o;return m(this,void 0,void 0,(function*(){try{const i=this.config.access_token,n=a.split("/").filter((e=>e.length>0));let r="";for(const a of n)if(r+="/"+a,!this.folderExistsCache.has(r))try{yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:r}}),this.folderExistsCache.add(r)}catch(a){if(404!==(null===(t=a.response)||void 0===t?void 0:t.status))return console.error("Error checking directory:",a),!1;try{yield e.put(`https://cloud-api.yandex.net/v1/disk/resources?path=${encodeURIComponent(r)}`,null,{headers:{Authorization:`OAuth ${i}`}}),this.folderExistsCache.add(r)}catch(e){if(409!==(null===(o=e.response)||void 0===o?void 0:o.status))return console.error("Error creating directory:",e),!1;this.folderExistsCache.add(r)}}return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}getAuthUrl(e){return`https://oauth.yandex.com/authorize?response_type=code&client_id=${C.yandexClientId}&redirect_uri=${e}&force_confirm=true`}}class M extends ${constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=this.baseFolder+"/"+t;for(;i.startsWith("/");)i=i.substring(1);const n=i.substring(0,i.lastIndexOf("/"));if(n){if(!(yield this.ensureDirectoryExists(n)))return console.error("Failed to create directory:",n),!1}const r=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/upload",{headers:{Authorization:`OAuth ${o}`,"Content-Type":"application/json"},params:{path:`/${i}`,overwrite:!0}});if(200!==r.status)return console.error("Error getting upload URL:",r),!1;const l=r.data.href;let s=t.split("/").pop()||"",d=new File([a],s,{lastModified:(new Date).getTime(),type:a.type});const c=yield e.put(l,d,{headers:{"Content-Type":a.type||"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0});return!(c.status>=300)||(console.error("Error occurred during file upload:",c),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);const i=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/download",{headers:{Authorization:`OAuth ${t}`,"Content-Type":"application/json"},params:{path:`/${o}`}});if(200!==i.status)return console.error("Error getting download URL:",i),!1;const n=i.data.href,r=yield e({url:n,method:"get",maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return r.status>=300?(console.error("Error occurred during file download:",r),!1):r.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class U{constructor(e){this.isExp=!1,this.folderIdCache=new Map,this.config=e,this.taskQueue=new k(3),this.isExp=this.config.isExp||!1,this.baseFolder="KoodoReader"}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getFileId(a,t){return m(this,void 0,void 0,(function*(){const o=this.config.access_token,i=`https://www.googleapis.com/drive/v3/files?q=name='${a}'+and+'${t}'+in+parents&fields=files(id,name)`;try{const a=yield e.get(i,{headers:{Authorization:"Bearer "+o}});if(0===a.data.files.length)return"";const t=a.data.files;return t.length>0?t[0].id:null}catch(e){return console.error("Error occurred during file list retrieval:",e),""}}))}checkFolder(a){return m(this,void 0,void 0,(function*(){a=this.baseFolder+"/"+a;const t=this.config.access_token;if(""===a)return"root";if(this.folderIdCache.has(a))return this.folderIdCache.get(a);const o=a.split("/").filter((e=>""!==e.trim()));let i="root",n="";for(const a of o){if(n=n?n+"/"+a:a,this.folderIdCache.has(n)){i=this.folderIdCache.get(n);continue}let o=yield this.getFolderId(a,i);if(!o){const n={name:a,mimeType:"application/vnd.google-apps.folder",parents:[i]};try{o=(yield e.post("https://www.googleapis.com/drive/v3/files",n,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.id}catch(e){throw console.error(`Error occurred during folder creation for ${a}:`,e),e}}this.folderIdCache.set(n,o),i=o}return i}))}getFolderId(a,t){return m(this,void 0,void 0,(function*(){const o=this.config.access_token,i=`https://www.googleapis.com/drive/v3/files?q=name='${a=encodeURIComponent(a)}'+and+mimeType='application/vnd.google-apps.folder'+and+'${t}'+in+parents&fields=files(id,name)`;try{const a=(yield e.get(i,{headers:{Authorization:`Bearer ${o}`}})).data.files;return a.length>0?a[0].id:null}catch(e){throw console.error("Error occurred during fetching folder ID:",e),e}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=yield this.checkFolder(a),i=[],n="",r=!0;for(;r;){let a=`https://www.googleapis.com/drive/v3/files?q='${o}'+in+parents&fields=nextPageToken,files(id,name,size,mimeType)&pageSize=1000`;n&&(a+=`&pageToken=${n}`);const l=yield e.get(a,{headers:{Authorization:`Bearer ${t}`}}),s=l.data.files||[];i=i.concat(s),n=l.data.nextPageToken,r=!!n}return[...new Set(i.map((e=>({name:e.name,size:e.size||0,type:"application/vnd.google-apps.folder"===e.mimeType?"folder":"file",modified:e.modifiedTime}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQue(e)}))))))}))}deleteFileWithoutQue(a){return m(this,void 0,void 0,(function*(){const t=a.split("/").pop()||"",o=a.split("/").slice(0,-1).join("/"),i=yield this.checkFolder(o),n=this.config.access_token,r=yield this.getFileId(t,i);if(""===r)return console.error("File not found:",t),!0;try{const a=yield e.delete(`https://www.googleapis.com/drive/v3/files/${r}`,{headers:{Authorization:`Bearer ${n}`}});return console.error("File deleted:",a),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${e}&prompt=consent&response_type=code&client_id=${C.googleClientId}&scope=https://www.googleapis.com/auth/${this.isExp?"drive":"drive.file"}&access_type=offline`}}class B extends U{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type}),r=t.split(".").pop(),l=p(r||""),s=t.split("/")[0],d=yield this.checkFolder(s),c=yield this.getFileId(i||"",d);const u={mimeType:l,name:i,parents:[d]},m=c?`https://www.googleapis.com/upload/drive/v3/files/${c}?uploadType=resumable`:"https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable",h=(yield e({method:c?"PATCH":"POST",url:m,data:c?null:JSON.stringify(u),headers:{Authorization:"Bearer "+o,"Content-Type":"application/json; charset=UTF-8"},maxContentLength:1/0,maxBodyLength:1/0})).headers.location,g=yield this.getData(n);if(0===Object.keys(g).length)return!1;const f=yield e.put(h,g.data,{headers:{Authorization:"Bearer "+o,"Content-Type":"application/zip","Content-Range":`bytes 0-${g.fileSize-1}/${g.fileSize}`},maxContentLength:1/0,maxBodyLength:1/0});return!(f.status>=300)||(console.error("Error occurred during file download:",f),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=a.split("/").pop(),i=a.split("/")[0],n=yield this.checkFolder(i),r=yield this.getFileId(o||"",n);if(!r)return console.error("File not found:",o),!0;const l=`https://www.googleapis.com/drive/v3/files/${r}?alt=media`,s=yield e.get(l,{headers:{Authorization:"Bearer "+t},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return s.status>=300?(console.error("Error occurred during file download:",s),!1):s.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getData(e){return m(this,void 0,void 0,(function*(){return e?new Promise(((a,t)=>{const o=new FileReader;o.onload=t=>a({fileName:e.name,mimeType:e.type,fileSize:e.size,data:t.target.result}),o.onerror=e=>t(e),o.readAsArrayBuffer(e)})):{}}))}}class z{constructor(e){this.folderCreationLocks=new Map,this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=2){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getStorage(){return m(this,void 0,void 0,(function*(){if(this.storage)return this.storage;let{email:e,password:t}=this.config;return this.storage=yield new a({email:e,password:t,userAgent:"KoodoReader/1.0"}).ready,this.storage}))}getRoot(){return m(this,void 0,void 0,(function*(){if(this.root)return this.root;const e=(yield this.getStorage()).root;if(""===this.baseFolder)return this.root=e,this.root;let a=e.children.find((e=>e.name===this.baseFolder&&e.directory));return a||(a=yield e.mkdir(this.baseFolder)),this.root=a,this.root}))}createFolder(e,a){return m(this,void 0,void 0,(function*(){const t=`${e.nodeId}_${a}`;if(this.folderCreationLocks.has(t))return yield this.folderCreationLocks.get(t);const o=(()=>m(this,void 0,void 0,(function*(){try{let t=e.children.find((e=>e.name===a&&e.directory));return t||(t=yield e.mkdir(a),t)}finally{this.folderCreationLocks.delete(t)}})))();return this.folderCreationLocks.set(t,o),yield o}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){try{let a=yield this.getRoot();if(e){const t=e.split("/").filter((e=>e));for(const e of t){const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return[];a=t}}return a.children.map((e=>({name:e.name,size:e.size||0,type:e.directory?"folder":"file",modified:e.timestamp?new Date(1e3*e.timestamp).toISOString():""})))}catch(e){return console.error("Error listing MEGA files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return m(this,void 0,void 0,(function*(){try{let a=yield this.getRoot();const t=e.split("/"),o=t.pop();for(const e of t){if(!e)continue;const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return!0;a=t}const i=a.children.find((e=>e.name===o&&!e.directory));return!i||(yield i.delete(),!0)}catch(e){return console.error("Error deleting MEGA file:",e),!1}}))}}class D extends z{constructor(e){super(e)}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{let o=yield this.getRoot();const i=a.split("/"),n=i.pop()||"";for(const e of i){if(!e)continue;let a=o.children.find((a=>a.name===e&&a.directory));a||(a=yield this.createFolder(o,e)),o=a}const r=new File([e],n,{lastModified:(new Date).getTime(),type:e.type}),l=yield e.arrayBuffer(),s=new Uint8Array(l),d=t.from(s),c=o.children.find((e=>e.name===n&&!e.directory));return c&&(yield c.delete()),yield o.upload({name:n,size:r.size},d).complete,!0}catch(e){return console.error("Error occurred during MEGA file upload:",e),!1}}))))))}))}downloadFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let a=yield this.getRoot();const t=e.split("/"),o=t.pop()||"";for(const e of t){if(!e)continue;const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return!0;a=t}const i=a.children.find((e=>e.name===o&&!e.directory));if(!i)return!0;const n=yield i.downloadBuffer();return this.taskQueue.setDownloadedSize(n.size),n.buffer}catch(e){return console.error("Error occurred during MEGA file download:",e),!1}}))))))}))}}class L{constructor(e){this.isExp=!1,this.baseUrl="https://graph.microsoft.com/v1.0/me/drive/special/approot",this.config=e,this.taskQueue=new k(3),this.isExp=this.config.isExp||!1,this.baseUrl=this.isExp?"https://graph.microsoft.com/v1.0/me/drive/root":"https://graph.microsoft.com/v1.0/me/drive/special/approot",void 0===this.config.baseFolder?this.baseFolder=this.isExp?"KoodoReader":"":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);let o,i=[];if(""===a)o=`${this.baseUrl}/children`;else{const e=encodeURIComponent(a);o=`${this.baseUrl}:/${e}:/children`}for(;o;){const a=yield e.get(o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(a.status>=300)break;const n=a.data.value||[];i=i.concat(n),o=a.data["@odata.nextLink"]||""}return[...new Set(i.map((e=>({name:e.name,size:e.size||0,type:e.folder?"folder":"file",modified:e.lastModifiedDateTime}))))]}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);const o=yield e.delete(`${this.baseUrl}:/${a}`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return!(o.status>=300)||(console.error("Error deleting file:",o),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${C.microsoftClientId}&scope=${this.isExp?"files.readwrite.all":"files.readwrite.appfolder"} offline_access&response_type=code&redirect_uri=${e}`}}class P extends L{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type}),r=this.baseFolder+"/"+t;for(;r.startsWith("/");)r=r.substring(1);const l=this.baseUrl+":/"+r+":/createUploadSession",s=yield e.post(l,null,{headers:{Authorization:"Bearer "+o,"Content-Type":"application/json"},maxContentLength:1/0,maxBodyLength:1/0});let d=n.size;const c=n.type,u=s.data.uploadUrl,m=yield e.put(u,n,{headers:{"Content-Type":c,"Content-Range":`bytes 0-${d-1}/${d}`},maxContentLength:1/0,maxBodyLength:1/0});return!(m.status>=300)||(console.error("Error occurred during file download:",m),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);const i=`${this.baseUrl}:/${o}:/content`,n=yield e.get(i,{responseType:"arraybuffer",headers:{Authorization:"Bearer "+t},maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error occurred during file download:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class j{downloadFile(e,a){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}listFiles(e){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e([])}))}))}getAuthUrl(){return""}}class K{constructor(e){this.baseUrl="https://api.pcloud.com",this.config=e,this.taskQueue=new k(3),this.baseUrl="2"===e.region?"https://eapi.pcloud.com":"https://api.pcloud.com"}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}checkFolderExists(a,t){return m(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:t,path:`/${a}`}})).data.result}catch(e){return console.error("Error checking folder:",e),!1}}))}createFolder(a,t){return m(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/createfolderifnotexists`,{params:{access_token:t,path:`/${a}`}})).data.result}catch(e){return console.error("Error creating folder:",e),!1}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:t,path:"/"+a,recursive:0}});return 0!==o.data.result?[]:o.data.metadata.contents.map((e=>({name:e.name,size:e.size||0,type:e.isfolder?"folder":"file",modified:e.modified})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/deletefile`,{params:{access_token:t,path:"/"+a}});return 0===o.data.result||(console.error("Error deleting file:",o.data),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://my.pcloud.com/oauth2/authorize?client_id=${C.pcloudClientId}&response_type=code&redirect_uri=${e}`}}class H extends K{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.refresh_token,i=t.split("/").slice(0,-1).join("/");if(!(yield this.checkFolderExists(i,o))){if(!(yield this.createFolder(i,o)))return!1}let n=t.split("/").pop()||"",r=new File([a],n,{lastModified:(new Date).getTime(),type:a.type});const l=new FormData;l.append("file",r);const s=yield e.post(`${this.baseUrl}/uploadfile`,l,{params:{access_token:o,path:`/${i}`,renew:1},maxContentLength:1/0,maxBodyLength:1/0});return 0===s.data.result||(console.error("Error uploading file:",s.data),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/getfilelink`,{params:{access_token:t,path:`/${a}`}});if(0!==o.data.result)return console.error("Error getting file link:",o.data),!0;const i=`https://${o.data.hosts[0]}${o.data.path}`,n=yield e.get(i,{responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error downloading file:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class J{constructor(e){this.config=e,this.taskQueue=new k(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=0){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}shouldUsePathStyle(){try{if(this.config.forcePathStyle&&"no"!==this.config.forcePathStyle)return!0;let e=this.config.endpoint;const a=new URL(e),t=a.hostname,o=/^(\d{1,3}\.){3}\d{1,3}$/.test(t),i=""!==a.port;return!o&&i}catch(e){return!0}}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){let{endpoint:a,region:t,bucketName:n,accessKeyId:r,secretAccessKey:l,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;let d=s+"/"+e;for(;d.startsWith("/");)d=d.substring(1);""===d||d.endsWith("/")||(d+="/");const c=new o({endpoint:a,region:t,credentials:{accessKeyId:r,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});try{let e,a=[],t=[],o=!0;for(;o;){const r=yield c.send(new i({Bucket:n,Prefix:d,Delimiter:"/",ContinuationToken:e}));r.Contents&&(a=a.concat(r.Contents)),r.CommonPrefixes&&(t=t.concat(r.CommonPrefixes)),e=r.NextContinuationToken,o=!!e}let r=[];return a.forEach((e=>{if(!e.Key.endsWith("/")){const a=e.Key.substring(d.length);a.includes("/")||r.push({name:a,size:e.Size||0,type:"file",modified:e.LastModified?e.LastModified.toISOString():""})}})),t.forEach((e=>{const a=e.Prefix.substring(d.length).replace(/\/$/,"");a&&r.push({name:a,size:0,type:"folder",modified:""})})),r}catch(e){return console.error(e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){let{endpoint:a,region:t,bucketName:i,accessKeyId:r,secretAccessKey:l,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;const d=new o({endpoint:a,region:t,credentials:{accessKeyId:r,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});let c=s+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{return yield d.send(new n({Bucket:i,Key:c})),!0}catch(e){return console.error(e),!1}}))}}class W extends J{constructor(e){super(e)}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:n,accessKeyId:l,secretAccessKey:s,dir:d}=this.config;const c=new o({endpoint:t,region:i,credentials:{accessKeyId:l,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});d=d&&"KoodoReader"===this.baseFolder?d:this.baseFolder;let u=d+"/"+a;for(;u.startsWith("/");)u=u.substring(1);try{let a=yield c.send(new r({Bucket:n,Key:u,Body:e}));return 200===a.$metadata.httpStatusCode||(console.error("Error uploading file:",a),!1)}catch(e){return console.error("Error: ",e),!1}}))))))}))}downloadFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let{endpoint:a,region:t,bucketName:i,accessKeyId:n,secretAccessKey:r,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;const d=new o({endpoint:a,region:t,credentials:{accessKeyId:n,secretAccessKey:r},forcePathStyle:this.shouldUsePathStyle()});let c=s+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{const e=yield d.send(new l({Bucket:i,Key:c}));if(!e.Body)return console.error("No response body"),!1;const a=yield e.Body.transformToByteArray();return this.taskQueue.setDownloadedSize(a.length),a.buffer}catch(a){return console.error("Error downloading file:",a,e),!1}}))))))}))}}class q{constructor(e){this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder;a&&""!==a.trim()&&(o=o+"/"+a),o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));let i=[],n=0;const r=1e3;for(;;){const a=yield e.get("https://pan.baidu.com/rest/2.0/xpan/file",{params:{method:"list",access_token:t,dir:"/"+o,start:n,limit:r,order:"name",desc:0,web:1,folder:0},headers:{"User-Agent":"pan.baidu.com"}});if(a.status>=300||0!==a.data.errno){console.error("百度网盘API错误:",a.data);break}const l=a.data.list||[];if(0===l.length)break;if(i=i.concat(l),l.length({name:e.server_filename,size:e.size||0,type:e.isdir?"folder":"file",modified:new Date(1e3*e.server_mtime).toISOString(),path:e.path,fs_id:e.fs_id})))}catch(e){return console.error("获取百度网盘文件列表时发生错误:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));const i=new URLSearchParams({async:"0",filelist:JSON.stringify(["/"+o])}),n=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=filemanager&access_token=${t}&opera=delete`,i.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==n.data.errno)return console.error("百度网盘删除文件API错误:",n.data),-9===n.data.errno?console.error("文件不存在"):111===n.data.errno?console.error("有其他异步任务正在执行"):-7===n.data.errno&&console.error("文件名非法"),!1;const r=n.data.info||[];for(const e of r)if(0!==e.errno)return console.error(`文件删除失败: ${e.path}, 错误码: ${e.errno}`),!1;return!0}catch(e){return console.error("删除文件时发生错误:",e),!1}}))}getAuthUrl(e){return`https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=${C.duboxClientId}&redirect_uri=${e}&scope=basic,netdisk&device_id=119827642&display=page&qrcode=1`}}const G=4194304;class Q extends q{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var o;try{const o=this.config.access_token;let i=this.baseFolder+"/"+t;i=i.replace(/\/+/g,"/"),i.startsWith("/")&&(i=i.substring(1));const n=yield a.arrayBuffer(),r=n.byteLength,l=new Uint8Array(n),{contentMd5:s,sliceMd5:d,blockList:c}=this.calculateFileMd5(l,r),u=new URLSearchParams({path:"/"+i,size:r.toString(),isdir:"0",autoinit:"1",rtype:"3",block_list:JSON.stringify(c),"content-md5":s,"slice-md5":d,local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),m=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=${o}`,u.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==m.data.errno)return console.error("预上传失败:",m.data),!1;const p=m.data.uploadid,h=m.data.block_list||[];if(0===h.length)return!0;const g=yield this.getUploadDomain(o,"/"+i,p);if(!g)return console.error("获取上传域名失败"),!1;for(const a of h){const t=a*G,n=Math.min(G,r-t),s=l.slice(t,t+n),d=new FormData;d.append("file",new Blob([s],{type:"application/octet-stream"}),`chunk_${a}`);const u=`${g}/rest/2.0/pcs/superfile2?method=upload&access_token=${o}&type=tmpfile&path=${encodeURIComponent("/"+i)}&uploadid=${p}&partseq=${a}`,m=yield e.post(u,d,{headers:{"User-Agent":"pan.baidu.com"},maxContentLength:1/0,maxBodyLength:1/0,timeout:0});if(m.status>=300)throw new Error(`分片上传失败: ${JSON.stringify(m.data)}`);const h=m.data.md5,f=c[a];h&&h!==f&&console.warn(`分片 ${a} MD5不匹配: 期望 ${f}, 实际 ${h}`)}const f=new URLSearchParams({path:"/"+i,size:r.toString(),isdir:"0",block_list:JSON.stringify(c),uploadid:p,rtype:"3",local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),y=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${o}`,f.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});return 0===y.data.errno||(console.error("创建文件失败:",y.data),!1)}catch(e){return console.error("文件上传过程中发生错误:",(null===(o=e.response)||void 0===o?void 0:o.data)||e.message||e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var t;this.taskQueue.setDownloadedSize(0);try{const o=this.config.access_token;let i=this.baseFolder+"/"+a;i=i.replace(/\/+/g,"/"),i.startsWith("/")&&(i=i.substring(1));const n=yield this.listFileInfos(a.substring(0,a.lastIndexOf("/"))),r=i.split("/").pop(),l=n.find((e=>e.name===r));if(!l)return console.error("文件不存在:",a),!1;const s=yield e.get("https://pan.baidu.com/rest/2.0/xpan/multimedia",{params:{method:"filemetas",access_token:o,fsids:JSON.stringify([l.fs_id]),dlink:1},headers:{"User-Agent":"pan.baidu.com"}});if(0!==s.data.errno||!(null===(t=s.data.list)||void 0===t?void 0:t[0]))return console.error("获取下载链接失败:",s.data),!1;const d=s.data.list[0].dlink;return(yield e.get(d,{responseType:"arraybuffer",params:{access_token:o},headers:{"User-Agent":"pan.baidu.com"},onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}})).data}catch(e){return console.error("下载文件时发生错误:",e),!1}}))))))}))}getUploadDomain(a,t,o){return m(this,void 0,void 0,(function*(){try{const i=yield e.get("https://d.pcs.baidu.com/rest/2.0/pcs/file",{params:{method:"locateupload",appid:"250528",access_token:a,path:t,uploadid:o,upload_version:"2.0"},headers:{"User-Agent":"pan.baidu.com"}});if(0!==i.data.error_code)return console.error("获取上传域名失败:",i.data),null;const n=i.data.servers||[],r=n.find((e=>e.server.startsWith("https://")));return r?r.server:n.length>0?n[0].server:(console.error("没有可用的上传服务器"),null)}catch(e){return console.error("获取上传域名时出错:",e),null}}))}calculateFileMd5(e,a){const t=[];let o="",i=0;for(;i=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getUploadCredentials(a){return m(this,void 0,void 0,(function*(){try{const t=yield e.get(`${this.baseUrl}/open/upload/get_token`,{headers:{Authorization:`Bearer ${a}`}});return t.status>=300||!t.data.state?(console.error("Error getting upload credentials:",t.data),null):t.data.data}catch(e){return console.error("Error occurred during get upload credentials:",e),null}}))}generateOSSPolicy(e,a,t=new Date(Date.now()+36e5)){const o={expiration:t.toISOString(),conditions:[{bucket:e},{key:a},["starts-with","$success_action_status","2"],["content-length-range",0,1073741824]]};return JSON.stringify(o)}getAuthUrl(e){return`https://passportapi.115.com/open/authorize?client_id=${C.yiyiwuClientId}&response_type=code&redirect_uri=${e}`}}class X extends Y{constructor(e){super(e)}sha1Hex(e){return m(this,void 0,void 0,(function*(){const a=yield crypto.subtle.digest("SHA-1",e);return Array.from(new Uint8Array(a)).map((e=>e.toString(16).padStart(2,"0"))).join("")}))}calculateFileSha1(e){return m(this,void 0,void 0,(function*(){try{const a=yield e.arrayBuffer();return this.sha1Hex(a)}catch(e){return console.error("Error calculating file SHA1:",e),""}}))}calculatePreSha1(e){return m(this,void 0,void 0,(function*(){try{const a=e.slice(0,131072),t=yield a.arrayBuffer();return this.sha1Hex(t)}catch(e){return console.error("Error calculating pre SHA1:",e),""}}))}calculateOSSSignature(e,a){const t=s.enc.Base64.stringify(s.enc.Utf8.parse(a));return s.HmacSHA1(t,e).toString(s.enc.Base64)}handleSecondAuth(e,a,t,o,i,n,r,l){return m(this,void 0,void 0,(function*(){try{if(!a.sign_check)return console.error("No sign_check provided for second authentication"),null;const[s,d]=a.sign_check.split("-"),c=parseInt(s),u=parseInt(d),m=t.slice(c,u+1),p=yield m.arrayBuffer(),h=(yield this.sha1Hex(p)).toUpperCase();return yield this.initializeUpload(e,o,i,n,r,l,a.sign_key,h,a.pick_code)}catch(e){return console.error("Error during second authentication:",e),null}}))}uploadToObjectStorage(a,t,o,i){var n;return m(this,void 0,void 0,(function*(){try{const n=i.endpoint,r=o.bucket,l=o.object;let s;if(n.includes(r))s=n;else{s=`https://${r}.${n.replace(/^https?:\/\//,"")}`}const d=this.generateOSSPolicy(r,l),c=this.calculateOSSSignature(i.AccessKeySecret,d),u=btoa(d),m=new FormData;if(m.append("key",l),m.append("policy",u),m.append("OSSAccessKeyId",i.AccessKeyId),m.append("signature",c),m.append("x-oss-security-token",i.SecurityToken),m.append("success_action_status","200"),o.callback&&o.callback.callback){const e=btoa(o.callback.callback);if(m.append("callback",e),o.callback.callback_var){const e=JSON.parse(o.callback.callback_var);for(const[a,t]of Object.entries(e))m.append(a,String(t))}}const p=new File([a],t,{type:a.type});m.append("file",p);const h=yield e.post(s,m,{maxContentLength:1/0,maxBodyLength:1/0});return 200===h.status||204===h.status||(console.error("Upload failed with status:",h.status),!1)}catch(e){return console.error("Error uploading file via REST API:",(null===(n=e.response)||void 0===n?void 0:n.data)||e.message||e),!1}}))}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var t;try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;o.startsWith("/")||(o="/"+o);const i=e.size,n=yield this.calculateFileSha1(e),r=yield this.calculatePreSha1(e),l=a.split("/").pop()||a,s=o.substring(0,o.lastIndexOf("/"))||"/";let d=yield this.getFolderInfo(s,!0),c="0";if(d)c=d.file_id;else{let e=yield this.createFolder(s);if(!e)return console.error("Failed to create folder:",s),!1;c=e}yield this.deleteFileWithoutQueue(a);let u=yield this.initializeUpload(c,l,i,n,r,t);if(!u)return console.error("Failed to initialize upload"),!1;if((6===u.status||7===u.status||8===u.status)&&(u=yield this.handleSecondAuth(c,u,e,l,i,n,r,t),!u))return console.error("Second authentication failed"),!1;if(2===u.status)return console.info(`File ${a} uploaded successfully via instant upload.`),!0;const m=yield this.getUploadCredentials(t);if(!m)return console.error("Failed to get upload credentials"),!1;return(yield this.uploadToObjectStorage(e,l,u,m))?(console.info(`File ${a} uploaded successfully.`),!0):(console.error("Failed to upload to object storage"),!1)}catch(e){return console.error("Error occurred during file upload:",(null===(t=e.response)||void 0===t?void 0:t.data)||e.message||e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let t=this.baseFolder+"/"+a;t=t.replace(/\/+/g,"/"),t.startsWith("/")||(t="/"+t);const o=yield this.getFolderInfo(t,!1);if(!o||!o.pick_code)return console.error("Failed to get file info or pick_code for:",a),!1;const i=yield this.getFileDownloadUrl(o.pick_code);if(!i)return console.error("Failed to get download URL for:",a),!1;const n=yield e.get(i.url,{responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error downloading file:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}initializeUpload(a,t,o,i,n,r,l,s,d){return m(this,void 0,void 0,(function*(){try{const c=new FormData;c.append("file_name",t),c.append("file_size",o.toString()),a?c.append("target","U_1_"+a):c.append("target","U_1_0"),c.append("fileid",i),c.append("preid",n),c.append("topupload","0"),d&&c.append("pick_code",d),l&&c.append("sign_key",l),s&&c.append("sign_val",s);const u=yield e.post(`${this.baseUrl}/open/upload/init`,c,{headers:{Authorization:`Bearer ${r}`,"Content-Type":"multipart/form-data"}});return u.status>=300||!u.data.state?(console.error("Error initializing upload:",u.data),null):u.data.data}catch(e){return console.error("Error occurred during upload initialization:",e),null}}))}createFolder(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=a.replace(/^\/+|\/+$/g,"");if(!o)return"";const i=o.split("/");let n="",r="0";for(const a of i){n=n?`${n}/${a}`:a;const o=yield this.getFolderInfo(n,!0);if(o&&o.file_id)r=o.file_id;else{const o=new FormData;o.append("pid",r),o.append("file_name",a);const i=yield e.post(`${this.baseUrl}/open/folder/add`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});if(i.status>=300||!i.data.state)return console.error("Error creating folder:",i.data),"";r=i.data.data.file_id}}return r}catch(e){return console.error("Error occurred during folder creation:",e),""}}))}getFolderInfo(a,t){return m(this,void 0,void 0,(function*(){if(""===a||"/"===a)return{file_id:"0"};a.startsWith("/")||(a="/"+a);try{const t=this.config.access_token,o=new FormData;o.append("path",a);const i=yield e.post(`${this.baseUrl}/open/folder/get_info`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});return i.status>=300||!i.data.state||0===i.data.data.length?(console.error("Error getting file info:",i.data),null):i.data.data}catch(e){return console.error("Error occurred during get file info:",e),null}}))}getFileDownloadUrl(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=new FormData;o.append("pick_code",a);const i=yield e.post(`${this.baseUrl}/open/ufile/downurl`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});if(i.status>=300)return console.error("Error getting download URL:",i.data),null;const n=i.data.data,r=Object.keys(n)[0];return r&&n[r]?n[r].url:(console.error("No file data found in download URL response"),null)}catch(e){return console.error("Error occurred during get download URL:",e.message||e),null}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;(a=this.baseFolder+"/"+a).startsWith("/")||(a="/"+a);let o=[],i=0;const n=1150;let r=!0,l=yield this.getFolderInfo(a,!0),s="";if(l)s=l.file_id;else{let e=yield this.createFolder(a);if(!e)return console.error("Failed to create folder:",a),[];s=e}if(!s)return console.error("Failed to get or create folder ID:",a),[];let d=s;for(;r;){const a={offset:i,limit:n,cur:1,show_dir:1};d&&(a.cid=d);const l=yield e.get(`${this.baseUrl}/open/ufile/files`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},params:a});if(l.status>=300)break;const s=l.data.data||[];o=o.concat(s),s.length({name:e.fn,size:e.fs||0,type:"0"===e.fc?"folder":"file",modified:new Date(1e3*e.upt).toISOString()})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;a=this.baseFolder+"/"+a;const o=yield this.getFolderInfo(a,!1);if(!o)return!0;const i=new FormData;i.append("file_ids",o.file_id);const n=yield e.post(`${this.baseUrl}/open/ufile/delete`,i,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});return!(n.status>=300||!n.data.state)||(console.error("Error deleting file:",n),!1)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}}class V{constructor(e){let{username:a,password:t,url:o,dir:i,AuthType:n,createClient:r}=e;void 0===e.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=e.baseFolder,i=i&&"KoodoReader"===this.baseFolder?i:this.baseFolder,this.username=a,this.password=t,this.url=o,this.dir=i,this.taskQueue=new k(5),this.AuthType=n,this.createClient=r}getClient(){return m(this,void 0,void 0,(function*(){return this.webdavClient||(this.url=yield this.handleUrlRedirection(this.url),this.webdavClient=this.createClient(this.url,{authType:this.AuthType.Password,username:this.username,password:this.password})),this.webdavClient}))}handleUrlRedirection(a){return m(this,void 0,void 0,(function*(){try{const t=yield e.head(a,{maxRedirects:0,validateStatus:()=>!0,timeout:5e3});return t.request&&t.request.responseURL&&t.request.responseURL!==a?t.request.responseURL:t.status>=300&&t.status<400&&t.headers.location?t.headers.location:a}catch(e){return console.info("Error handling URL redirection:",e),a}}))}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){const a=yield this.getClient();try{const t=a.getDirectoryContents(this.dir+"/"+e),o=new Promise(((e,a)=>{setTimeout((()=>a(new Error("WebDAV list directory timeout"))),5e3)}));return(yield Promise.race([t,o])).filter((a=>"."!==a.filename&&".."!==a.filename&&a.filename!==e)).map((e=>({name:e.basename,size:e.size||0,type:"directory"===e.type?"folder":"file",modified:e.lastmod})))}catch(t){return t.response&&404===t.response.status&&(yield a.createDirectory(this.dir+"/"+e)),console.error("Error listing files:",t),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){const a=yield this.getClient();try{return yield a.deleteFile(this.dir+"/"+e),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(e){return m(this,void 0,void 0,(function*(){let a=yield this.getClient();try{const t=e.replace(/^\/+|\/+$/g,"").split("/").filter((e=>e.length>0));let o="";for(const e of t)o=o?`${o}/${e}`:e,(yield a.exists(`/${o}`))||(yield a.createDirectory(`/${o}`));return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}}class Z extends V{constructor(e){super(Object.assign(Object.assign({},e),{AuthType:d,createClient:c}))}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{let o=this.dir+"/"+t,i=yield this.getClient();const n=i.exists(o.substring(0,o.lastIndexOf("/"))),r=new Promise(((e,a)=>{setTimeout((()=>a(new Error("WebDAV exists check timeout"))),5e3)}));!1===(yield Promise.race([n,r]))&&(yield this.ensureDirectoryExists(o.substring(0,o.lastIndexOf("/"))));let l=t.split("/").pop()||"",s=new File([a],l,{lastModified:(new Date).getTime(),type:a.type}),d=i.getFileUploadLink(this.dir+"/"+t);const c=new URL(d);c.search="",d=c.toString();const u=btoa(this.username+":"+this.password),m=yield e.put(d,s,{headers:{Authorization:"Basic "+u},maxContentLength:1/0,maxBodyLength:1/0});return!(m.status>=300)||(console.error("Error occurred during file upload:",m),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){if(this.taskQueue.setDownloadedSize(0),-1===a.indexOf("."))return new ArrayBuffer(0);try{const t=btoa(this.username+":"+this.password);let o=this.url.endsWith("/")?this.url:this.url+"/",i=this.dir.startsWith("/")?this.dir.substring(1):this.dir;const n=yield e({url:o+i+"/"+a,method:"get",headers:{Authorization:"Basic "+t},responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error occurred during file download:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ee{constructor(e){this.username=e.username,this.password=e.password,this.url=e.url,this.taskQueue=new k(3)}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{return(yield e.get(`${this.url}/list`,{params:{dir:a},auth:{username:this.username,password:this.password}})).data.files.map((e=>({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modifiedTime})))||[]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{return(yield e.delete(`${this.url}/delete`,{params:{dir:a.split("/").slice(0,-1).join("/")||"",filename:a.split("/").pop()},auth:{username:this.username,password:this.password}})).data.success}catch(e){return console.error("Error deleting file:",e),!1}}))}}class ae extends ee{constructor(e){super(e)}getAuthHeader(){return`Basic ${btoa(`${this.username}:${this.password}`)}`}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=t.split("/").pop()||"",i=t.substring(0,t.lastIndexOf("/"))||"";let n=this.listFiles("");const r=new Promise(((e,a)=>{setTimeout((()=>a(new Error("Docker connection timeout"))),5e3)}));yield Promise.race([n,r]);let l=new File([a],o,{lastModified:(new Date).getTime(),type:a.type});const s=new FormData;s.append("file",l);const d=yield e.post(`${this.url}/upload?dir=${encodeURIComponent(i)}`,s,{headers:{Authorization:this.getAuthHeader(),"Content-Type":"multipart/form-data"},maxContentLength:1/0,maxBodyLength:1/0});return!(d.status>=300)||(console.error("Error occurred during file upload:",d),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=a.split("/").pop()||"",o=a.substring(0,a.lastIndexOf("/"))||"",i=yield e({url:`${this.url}/download`,method:"GET",params:{dir:o,filename:t},headers:{Authorization:this.getAuthHeader()},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return i.status>=300?(console.error("Error occurred during file download:",i),!1):i.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}const te=["book","config","cover","font"];class oe{constructor(e,a){this.type=e,this.remote="dropbox"===e?new _(a):"microsoft"===e?new P(a):"google"===e?new B(a):"microsoft_exp"===e?new P(Object.assign(Object.assign({},a),{isExp:!0})):"google_exp"===e?new B(Object.assign(Object.assign({},a),{isExp:!0})):"s3compatible"===e?new W(a):"webdav"===e?new Z(a):"docker"===e?new ae(a):"boxnet"===e?new R(a):"mega"===e?new D(a):"adrive"===e?new I(a):"pcloud"===e?new H(a):"dubox"===e?new Q(a):"yandex"===e?new M(a):"yiyiwu"===e?new X(a):new j}downloadFile(e,a){return m(this,void 0,void 0,(function*(){if("cover"!==a){if(!(yield this.listFiles(a)).find((a=>e.indexOf(a)>-1)))return!1}return yield this.remote.downloadFile(a+"/"+e)}))}uploadFile(e,a,t){return m(this,void 0,void 0,(function*(){return 0===t.size||(yield this.remote.uploadFile(t,a+"/"+e))}))}deleteFile(e,a){return m(this,void 0,void 0,(function*(){return!(yield this.listFiles(a)).find((a=>e.indexOf(a)>-1))||(yield this.remote.deleteFile(a+"/"+e))}))}listFiles(e){return m(this,void 0,void 0,(function*(){return yield this.remote.listFiles(e)}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){return yield this.remote.listFileInfos(e)}))}isExist(e,a){return m(this,void 0,void 0,(function*(){return(yield this.listFiles(a)).find((a=>-1!==a.indexOf(e)))}))}downloadAllFiles(){return m(this,void 0,void 0,(function*(){for(let e of te){let a=yield this.listFiles(e);for(let t of a)yield this.downloadFile(t,e)}}))}getAuthUrl(e){return this.remote.getAuthUrl?this.remote.getAuthUrl(e):""}getStats(){return this.remote.taskQueue.getStats()}clearQueue(){return this.remote.taskQueue.clearQueue()}resetCounters(){this.remote.taskQueue.resetCounters()}getDownloadedSize(){return this.remote.taskQueue.getDownloadedSize()}}const ie={words:['ALTER TABLE words ADD COLUMN "sentence" text']},ne={notes:"SELECT * FROM notes WHERE key = ?",bookmarks:"SELECT * FROM bookmarks WHERE key = ?",books:"SELECT * FROM books WHERE key = ?",plugins:"SELECT * FROM plugins WHERE key = ?",words:"SELECT * FROM words WHERE key = ?"},re={notes:"SELECT * FROM notes WHERE bookKey = ?",bookmarks:"SELECT * FROM bookmarks WHERE bookKey = ?",words:"SELECT * FROM words WHERE bookKey = ?",books:"SELECT * FROM books WHERE key = ?"},le={notes:"DELETE FROM notes WHERE bookKey = ?",bookmarks:"DELETE FROM bookmarks WHERE bookKey = ?",words:"DELETE FROM words WHERE bookKey = ?"};function se(e){for(const a in e)e.hasOwnProperty(a)&&(e[`temp-${a}`]=e[a]);return e}const de={notes:e=>{let a=Object.assign({},e);return a.date=JSON.parse(e.date),a.tag=JSON.parse(e.tag),a},bookmarks:e=>e,books:e=>e,plugins:e=>{let a=Object.assign({},e);return e.autoValue||delete a.autoValue,e.langList?a.langList=JSON.parse(e.langList):delete a.langList,e.voiceList?a.voiceList=JSON.parse(e.voiceList):delete a.voiceList,a.config=JSON.parse(e.config),a},words:e=>{let a=Object.assign({},e);return a.date=JSON.parse(e.date),void 0===a.sentence&&(a.sentence=""),a}};var ce={sqlStatement:{createTableStatement:se({notes:'\n CREATE TABLE IF NOT EXISTS "notes" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "chapter" text,\n "chapterIndex" integer,\n "text" text,\n "cfi" text,\n "range" text,\n "notes" text,\n "percentage" text,\n "color" integer,\n "tag" array\n )\n ',bookmarks:'\n CREATE TABLE IF NOT EXISTS "bookmarks" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "cfi" text,\n "label" text,\n "percentage" text,\n "chapter" text\n );\n ',books:'\n CREATE TABLE IF NOT EXISTS "books" (\n "key" text PRIMARY KEY,\n "name" text,\n "author" text,\n "description" text,\n "md5" text,\n "cover" text,\n "format" text,\n "publisher" text,\n "size" integer,\n "page" integer,\n "path" text,\n "charset" text\n );\n ',plugins:'\n CREATE TABLE IF NOT EXISTS "plugins" (\n "key" text PRIMARY KEY,\n "type" text,\n "displayName" text,\n "icon" text,\n "version" text,\n "config" object,\n "autoValue" string,\n "langList" text,\n "voiceList" text,\n "scriptSHA256" text,\n "script" text\n );\n ',words:'\n CREATE TABLE IF NOT EXISTS "words" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "word" text,\n "sentence" text,\n "chapter" text\n );\n '}),migrateStatement:se(ie),getAllStatement:se({notes:"SELECT * FROM notes",bookmarks:"SELECT * FROM bookmarks",books:"SELECT * FROM books",plugins:"SELECT * FROM plugins",words:"SELECT * FROM words"}),getPagedStatement:se({notes:"SELECT * FROM notes LIMIT ? OFFSET ?",bookmarks:"SELECT * FROM bookmarks LIMIT ? OFFSET ?",books:"SELECT * FROM books LIMIT ? OFFSET ?",plugins:"SELECT * FROM plugins LIMIT ? OFFSET ?",words:"SELECT * FROM words LIMIT ? OFFSET ?"}),getCountStatement:se({notes:"SELECT COUNT(*) as count FROM notes",bookmarks:"SELECT COUNT(*) as count FROM bookmarks",books:"SELECT COUNT(*) as count FROM books",plugins:"SELECT COUNT(*) as count FROM plugins",words:"SELECT COUNT(*) as count FROM words"}),saveStatement:se({notes:"INSERT OR REPLACE INTO notes (key, bookKey, chapter, chapterIndex, text, cfi, range, notes, date, percentage, color, tag) VALUES (@key, @bookKey, @chapter, @chapterIndex, @text, @cfi, @range, @notes, @date, @percentage, @color, @tag)",bookmarks:"INSERT OR REPLACE INTO bookmarks (key, bookKey, cfi, label, percentage, chapter) VALUES (@key, @bookKey, @cfi, @label, @percentage, @chapter)",books:"INSERT OR REPLACE INTO books (key, name, author, description, md5, cover, format, publisher, size, page, path, charset) VALUES (@key, @name, @author, @description, @md5, @cover, @format, @publisher, @size, @page, @path, @charset)",plugins:"INSERT OR REPLACE INTO plugins (key, type, displayName, icon, version, config, autoValue, langList, voiceList, scriptSHA256, script) VALUES (@key, @type, @displayName, @icon, @version, @config, @autoValue, @langList, @voiceList, @scriptSHA256, @script)",words:"INSERT OR REPLACE INTO words (key, bookKey, date, word, sentence, chapter) VALUES (@key, @bookKey, @date, @word, @sentence, @chapter)"}),deleteAllStatement:se({notes:"DELETE FROM notes",bookmarks:"DELETE FROM bookmarks",books:"DELETE FROM books",plugins:"DELETE FROM plugins",words:"DELETE FROM words"}),updateStatement:se({notes:"UPDATE notes SET bookKey = @bookKey, chapter = @chapter, chapterIndex = @chapterIndex, text = @text, cfi = @cfi, range = @range, notes = @notes, date = @date, percentage = @percentage, color = @color, tag = @tag WHERE key = @key",bookmarks:"UPDATE bookmarks SET bookKey = @bookKey, cfi = @cfi, label = @label, percentage = @percentage, chapter = @chapter WHERE key = @key",books:"UPDATE books SET name = @name, author = @author, description = @description, md5 = @md5, cover = @cover, format = @format, publisher = @publisher, size = @size, page = @page, path = @path, charset = @charset WHERE key = @key",plugins:"UPDATE plugins SET type = @type, displayName = @displayName, icon = @icon, version = @version, config = @config, autoValue = @autoValue, langList = @langList, voiceList = @voiceList, scriptSHA256 = @scriptSHA256, script = @script WHERE key = @key",words:"UPDATE words SET bookKey = @bookKey, date = @date, word = @word, sentence = @sentence, chapter = @chapter WHERE key = @key"}),deleteStatement:se({notes:"DELETE FROM notes WHERE key = ?",bookmarks:"DELETE FROM bookmarks WHERE key = ?",books:"DELETE FROM books WHERE key = ?",plugins:"DELETE FROM plugins WHERE key = ?",words:"DELETE FROM words WHERE key = ?"}),dropStatement:se({notes:"DROP TABLE IF EXISTS notes",bookmarks:"DROP TABLE IF EXISTS bookmarks",books:"DROP TABLE IF EXISTS books",plugins:"DROP TABLE IF EXISTS plugins",words:"DROP TABLE IF EXISTS words"}),getStatement:se(ne),getByBookKeyStatement:se(re),getByBookKeysStatement:se({notes:e=>`SELECT * FROM notes WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,bookmarks:e=>`SELECT * FROM bookmarks WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,words:e=>`SELECT * FROM words WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")})`}),getKeysStatement:se({notes:"SELECT key FROM notes",bookmarks:"SELECT key FROM bookmarks",books:"SELECT key FROM books",plugins:"SELECT key FROM plugins",words:"SELECT key FROM words"}),getWithSortAndPageStatement:se({notes:(e,a,t,o)=>`SELECT * FROM notes ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,bookmarks:(e,a,t,o)=>`SELECT * FROM bookmarks ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,books:(e,a,t,o)=>`SELECT * FROM books ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,plugins:(e,a,t,o)=>`SELECT * FROM plugins ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,words:(e,a,t,o)=>`SELECT * FROM words ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`}),getByKeysStatement:se({notes:e=>`SELECT * FROM notes WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,bookmarks:e=>`SELECT * FROM bookmarks WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,plugins:e=>`SELECT * FROM plugins WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,words:e=>`SELECT * FROM words WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`}),deleteByBookKeyStatement:se(le)},jsonToSqlite:se({notes:e=>{let a=Object.assign({},e);return a.date=JSON.stringify(e.date),a.tag=JSON.stringify(e.tag),a},bookmarks:e=>e,books:e=>{let a=Object.assign({},e);return a.page=e.page||0,a},plugins:e=>{let a=Object.assign({},e);return e.autoValue||(a.autoValue=null),e.langList?a.langList=JSON.stringify(e.langList):a.langList=null,e.voiceList?a.voiceList=JSON.stringify(e.voiceList):a.voiceList=null,a.config=JSON.stringify(e.config),a},words:e=>{let a=Object.assign({},e);return a.date=JSON.stringify(e.date),void 0===a.sentence&&(a.sentence=""),a}}),sqliteToJson:se(de)};const ue=E.cloudUrl,me=E.cloudCNUrl;class pe{constructor(e,a,t){this.TokenService=e,this.ConfigService=a,this.baseUrl="china"===t?me:ue,this.serverRegion=t,this.refreshToken="",this.accessToken="",this.streamPromise=null,this.expiresAt=0}refreshUserToken(){return m(this,void 0,void 0,(function*(){if(this.refreshToken=yield this.TokenService.getToken("refresh_token"),!this.refreshToken)return{code:401,message:"refresh token not found"};let a=(yield e.post(this.baseUrl+"/api/v1/public/user/refresh_token",{refresh_token:this.refreshToken})).data;return 200===a.code&&(yield this.TokenService.setToken("access_token",a.data.access_token),yield this.TokenService.setToken("refresh_token",a.data.refresh_token),yield this.TokenService.setToken("expires_at",(1e3*a.data.expires_at).toString()),this.accessToken=a.data.access_token,this.refreshToken=a.data.refresh_token,this.expiresAt=1e3*a.data.expires_at),a}))}requestWithRetry(e){return m(this,void 0,void 0,(function*(){return pe.requestQueue||(pe.requestQueue=[]),new Promise(((a,t)=>{pe.requestQueue.push({config:e,resolve:a,reject:t}),pe.processingQueue||this.processQueue()}))}))}isTokenValid(){return m(this,void 0,void 0,(function*(){if(this.accessToken||(this.accessToken=(yield this.TokenService.getToken("access_token"))||""),!this.expiresAt){const e=yield this.TokenService.getToken("expires_at");this.expiresAt=e?parseInt(e):(new Date).getTime()+31536e9}return""!==this.accessToken&&this.expiresAt>(new Date).getTime()+6e4}))}processQueue(){return m(this,void 0,void 0,(function*(){if(!pe.processingQueue){pe.processingQueue=!0;try{for(;pe.requestQueue.length>0;){const e=pe.requestQueue.shift();try{let a=yield this.executeRequest(e.config);e.resolve(a)}catch(a){e.reject(a)}}}finally{pe.processingQueue=!1}}}))}executeRequest(a){return m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let t="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);if(a.baseURL=this.baseUrl,a.headers)a.headers.Authorization="Bearer "+this.accessToken,a.headers["X-Request-ID"]=t;else{let e=this.ConfigService.getItem("appVersion"),o=this.ConfigService.getItem("appPlatform");a.headers={Authorization:"Bearer "+this.accessToken,"X-Request-ID":t,"X-App-Version":e||"1.0.0","X-App-Platform":o||"web"}}let o=(yield e(a)).data;if(402===o.code){let t=yield this.refreshUserToken();if(200===t.code){return a.headers=a.headers||{},a.headers.Authorization="Bearer "+this.accessToken,(yield e(a)).data}return t}return 200!==o.code&&console.error("Request error:",o),o}catch(e){return console.error("Request execution error:",e),"Network Error"===e.message?{code:503,message:"network error",data:null,msg:"Network error, please try again later. 网络错误,请稍后再试。"}:{code:500,message:e.message||"Unknown error",msg:e.message||"Unknown error",data:null}}}))}requestWithStream(e,a,t){return m(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let o=this.accessToken||"",i="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((n,r)=>{let l=this.ConfigService.getItem("appVersion"),s=this.ConfigService.getItem("appPlatform");const d=new t(this.baseUrl+e.url,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+o,"X-Request-ID":i,"X-App-Version":l||"1.0.0","X-App-Platform":s||"web"},method:e.method,body:JSON.stringify(e.data),pollingInterval:0});d.addEventListener("open",(()=>{console.info("Connection to OpenAI established.")})),d.addEventListener("message",(e=>m(this,void 0,void 0,(function*(){if(!e.data)return;const t=JSON.parse(e.data);t.done?(d.close(),n(t)):a(t.data)})))),d.addEventListener("error",(e=>{if(console.info("Error:",e),!e.data)return;const t=JSON.parse(e.data);a(t.data),n(t),d.close()}))}))}finally{this.streamPromise=null}})))()),this.streamPromise}))}requestWithFetch(e,a){return m(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let t=this.accessToken||"",o="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((i,n)=>m(this,void 0,void 0,(function*(){let n=this.ConfigService.getItem("appVersion"),r=this.ConfigService.getItem("appPlatform");var l=new u(this.baseUrl+e.url,{headers:{"Content-Type":"text/plain",Authorization:"Bearer "+t,"X-Request-ID":o,"X-App-Version":n||"1.0.0","X-App-Platform":r||"web"},payload:JSON.stringify(e.data),method:"POST"});l.addEventListener("message",(e=>m(this,void 0,void 0,(function*(){if(!e.data)return;const t=JSON.parse(e.data);t.done?(l.close(),i(t)):a(t.data)})))),l.addEventListener("open",(e=>{console.info(e,"Connection to OpenAI established.")})),l.addEventListener("error",(e=>{if(console.error(e,"Error occurred while connecting to OpenAI"),!e.data)return;const t=JSON.parse(e.data);a(t.data),i(t),l.close()}))}))))}finally{this.streamPromise=null}})))()),this.streamPromise}))}}pe.processingQueue=!1,pe.requestQueue=[];class he extends pe{constructor(e,a,t){super(e,a,t)}getTransStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_trans_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getTransFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_trans_stream",data:e};return yield this.requestWithFetch(t,a)}))}getDictionary(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_dict",data:e};return yield this.requestWithRetry(a)}))}getBatchTrans(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_batch_trans",data:e};return yield this.requestWithRetry(a)}))}getSplitSentence(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_split_sentence",data:e};return yield this.requestWithRetry(a)}))}getAnswerStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_answer_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getAnswerFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_answer_stream",data:e};return yield this.requestWithFetch(t,a)}))}getSummaryStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_sum_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getSummaryFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_sum_stream",data:e};return yield this.requestWithFetch(t,a)}))}getDictionaryStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_dict_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getDictionaryFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_dict_stream",data:e};return yield this.requestWithFetch(t,a)}))}getGoogleFont(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_google_font",data:e};return yield this.requestWithRetry(a)}))}sendToKindle(e,a){return m(this,void 0,void 0,(function*(){let t=new FormData;t.append("file",e.file),t.append("email",e.email),t.append("file_name",e.fileName);const o={method:"post",url:"/api/v1/pro/reader/send_to_kindle",headers:{"Content-Type":"multipart/form-data"},data:t,onUploadProgress:a?t=>{var o;const i=t.total||(null===(o=e.file)||void 0===o?void 0:o.size)||0;i>0&&a(Math.min(t.loaded/i,1))}:void 0};return yield this.requestWithRetry(o)}))}detectLanguage(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/detect_language",data:e};return yield this.requestWithRetry(a)}))}getTTSAudio(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_tts_audio",data:e};return yield this.executeRequest(a)}))}getOcrResult(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_ocr_result",data:e};return yield this.executeRequest(a)}))}getOcrResultV2(e){return m(this,void 0,void 0,(function*(){let a=new FormData;a.append("file",e.file);const t={method:"post",url:"/api/v1/pro/reader/get_ocr_result_v2",headers:{"Content-Type":"multipart/form-data"},data:a};return yield this.executeRequest(t)}))}analyzeText(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/analyze_text",data:e};return yield this.requestWithRetry(a)}))}getBookMetadata(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_book_metadata",data:e};return yield this.requestWithRetry(a)}))}analyzeBookTitle(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/analyze_book_title",data:e};return yield this.requestWithRetry(a)}))}}class ge extends pe{constructor(e,a,t){super(e,a,t),this.serverRegion=t}encryptToken(e){return m(this,void 0,void 0,(function*(){let a=e.token,t=v.encode(a),{extracted:o,remaining:i}=function(e){let a="",t="",o=[],i=1;for(;i<=e.length;)o.push(i-1),i*=2;for(let i=0;i-1){let t=a.split("#");e.encrypted_token=t[1]}const t={method:"post",url:"/api/v1/pro/thirdparty/decrypt_token",data:e};let o=yield this.requestWithRetry(t);if(a.indexOf("#")>-1&&o.data&&o.data.token){let e=a.split("#"),t=function(e,a){let t="",o=[],i=1,n=e.length+a.length;for(;i<=n;)o.push(i-1),i*=2;let r=0,l=0;for(let i=0;i{let o="";if("github"===e?o=`https://github.com/login/oauth/authorize?client_id=${C.githubClientId}&redirect_uri=${t}&scope=${T.github.scopes.join(" ")}&response_type=code`:"google"===e?o=`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${t}&prompt=consent&response_type=code&client_id=${C.googleClientId}&scope=${T.google.scopes.join(" ")}&access_type=offline`:"facebook"===e?o=`https://www.facebook.com/v12.0/dialog/oauth?client_id=${C.facebookClientId}&redirect_uri=${t}&scope=&response_type=code`:"microsoft"===e&&(o=`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${C.microsoftClientId}&scope=${T.microsoft.scopes.join(" ")}&response_type=code&redirect_uri=${t}`),"manual"===a)return o;let i=JSON.stringify({deeplink:"desktop"===a?"koodo-reader://callback":"browser"===a?`${C.callbackUrl}#/login`:"",service:e});return`${o}&state=${"state|"+encodeURIComponent(i)}`}};class Ne{static CompareDatabase(e,a,t){return m(this,void 0,void 0,(function*(){let o=Object.keys(e).filter((e=>e.startsWith("database.sqlite.books"))),i=Object.keys(e).filter((e=>e.startsWith("database.sqlite.notes"))),n=Object.keys(e).filter((e=>e.startsWith("database.sqlite.bookmarks"))),r=Object.keys(e).filter((e=>e.startsWith("database.sqlite.plugins"))),l=Object.keys(e).filter((e=>e.startsWith("database.sqlite.words"))),s=Object.keys(a).filter((e=>e.startsWith("database.sqlite.books"))),d=Object.keys(a).filter((e=>e.startsWith("database.sqlite.notes"))),c=Object.keys(a).filter((e=>e.startsWith("database.sqlite.bookmarks"))),u=Object.keys(a).filter((e=>e.startsWith("database.sqlite.plugins"))),m=Object.keys(a).filter((e=>e.startsWith("database.sqlite.words"))),p={books:Array.from(new Set(o.concat(s))),notes:Array.from(new Set(i.concat(d))),bookmarks:Array.from(new Set(n.concat(c))),plugins:Array.from(new Set(r.concat(u))),words:Array.from(new Set(l.concat(m)))},h={books:{save:[],update:[],delete:[],conflict:[],upload:[]},notes:{save:[],update:[],delete:[],conflict:[],upload:[]},bookmarks:{save:[],update:[],delete:[],conflict:[],upload:[]},plugins:{save:[],update:[],delete:[],conflict:[],upload:[]},words:{save:[],update:[],delete:[],conflict:[],upload:[]}},g=["books","notes","bookmarks","plugins","words"];for(let o of g)for(let i of p[o]){let n=i.split(".")[3],r=e[i],l=a[i];r?l?("save"===l.operation&&("update"!==r.operation&&"delete"!==r.operation||h[o].upload.push(n)),"delete"===l.operation&&("save"===r.operation&&(h[o].delete.push(n),e[i]=l),"update"===r.operation&&(r.timel.time&&(h[o].conflict.push(n),"cloud"===t?(h[o].delete.push(n),e[i]=l):h[o].upload.push(n))),r.operation),"update"===l.operation&&("save"===r.operation&&(h[o].update.push(n),e[i]=l),"update"===r.operation&&(r.timel.time&&h[o].upload.push(n)),"delete"===r.operation&&(r.timel.time&&h[o].upload.push(n)))):h[o].upload.push(n):(h[o].save.push(n),e[i]=l)}return{compareResult:h,syncRecords:e}}))}static CompareConfig(e,a,t){return m(this,void 0,void 0,(function*(){let o=Object.keys(e).filter((e=>e.startsWith("config.readerConfig"))),i=Object.keys(e).filter((e=>e.startsWith("config.listConfig"))),n=Object.keys(e).filter((e=>e.startsWith("config.objectConfig"))),r=Object.keys(e).filter((e=>e.startsWith("config.mapConfig"))),l=Object.keys(a).filter((e=>e.startsWith("config.readerConfig"))),s=Object.keys(a).filter((e=>e.startsWith("config.listConfig"))),d=Object.keys(a).filter((e=>e.startsWith("config.objectConfig"))),c=Object.keys(a).filter((e=>e.startsWith("config.mapConfig"))),u={readerConfig:Array.from(new Set(o.concat(l))),listConfig:Array.from(new Set(i.concat(s))),objectConfig:Array.from(new Set(n.concat(d))),mapConfig:Array.from(new Set(r.concat(c)))},m={readerConfig:{update:[],upload:[]},listConfig:{update:[],upload:[]},objectConfig:{update:[],delete:[],conflict:[],save:[],upload:[]},mapConfig:{update:[],delete:[],conflict:[],save:[],upload:[]}},p=["readerConfig","listConfig"];for(let t of p)for(let o of u[t]){let i=o,n=e[o],r=a[o];n?r?n.timer.time&&m[t].upload.push(i):m[t].upload.push(i):(m[t].update.push(i),e[o]=r)}let h=["objectConfig","mapConfig"];for(let o of h)for(let i of u[o]){let n=i,r=e[i],l=a[i];r?l?("delete"===l.operation&&("update"===r.operation&&(r.timel.time&&(m[o].conflict.push(n),"cloud"===t?(m[o].delete.push(n),e[i]=l):m[o].upload.push(n))),r.operation),"update"===l.operation&&("update"===r.operation&&(r.timel.time&&m[o].upload.push(n)),"delete"===r.operation&&(r.timel.time&&m[o].upload.push(n)))):m[o].upload.push(n):(m[o].update.push(n),e[i]=l)}return{compareResult:m,syncRecords:e}}))}static compareAll(e,a,t,o,i){return m(this,void 0,void 0,(function*(){let n="cloud";if("yes"===t.getReaderConfig("isKeepLocal")){n="local";let e=t.getObjectConfig(yield o.getFingerprint(),"cloudSyncTime",{time:0,conflictMode:"cloud"}),a=yield i.getCloudConfig("config"),r=JSON.parse(a.cloudSyncTime||"{}");delete r[yield o.getFingerprint()],Object.values(r).filter((a=>"local"===a.conflictMode&&a.time>e.time)).length>0&&(n="cloud")}let{compareResult:r,syncRecords:l}=yield this.CompareDatabase(e,a,n),{compareResult:s,syncRecords:d}=yield this.CompareConfig(l,a,n),c=Object.assign(Object.assign({},r),s);return t.setAllSyncRecord(d),"local"===n&&(c.books.conflict.length>0||c.notes.conflict.length>0||c.bookmarks.conflict.length>0||c.plugins.conflict.length>0||c.words.conflict.length>0||c.objectConfig.conflict.length>0||c.mapConfig.conflict.length>0)?t.setObjectConfig(yield o.getFingerprint(),{time:(new Date).getTime(),conflictMode:"local"},"cloudSyncTime"):t.setObjectConfig(yield o.getFingerprint(),{time:(new Date).getTime(),conflictMode:"cloud"},"cloudSyncTime"),c}))}static startSync(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){let r=yield this.syncConfig(e,a,t,i,n,o);if(e.books.save.length>0||e.books.upload.length>0){let e=yield this.syncCover(a,n,i),t=yield this.syncBook(a,i);return[...r,...e,...t]}return r}))}static syncConfig(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){let r=[];for(let a of h){if(e[a].save.length+e[a].update.length>0){let o=yield n.getCloudDatabase(a);for(let i of e[a].save){let e=o.find((e=>e.key===i));e&&(yield t.saveRecord(e,a))}for(let i of e[a].update){let e=o.find((e=>e.key===i));e&&(yield t.updateRecord(e,a,!1))}}if(e[a].delete.length>0)for(let n of e[a].delete)"books"===a&&(yield o.deleteOfflineBook(n),yield i.deleteOfflineCover(n)),yield t.deleteRecord(n,a);yield t.dumpDatabase(a,!0)}if(e.readerConfig.update.length>0||e.listConfig.update.length>0||e.objectConfig.update.length>0||e.mapConfig.update.length>0){let t=yield n.getCloudConfig("config");for(let o of e.readerConfig.update){let e=o.split(".")[3];t.readerConfig&&a.setReaderConfig(e,JSON.parse(t.readerConfig)[e],!1)}for(let o of e.listConfig.update){let e=o.split(".")[3];t[e]&&a.setAllListConfig(JSON.parse(t[e]),e,!1)}for(let o of e.objectConfig.update){let e=o.split(".")[3],i=o.split(".")[2];t[i]&&JSON.parse(t[i])&&JSON.parse(t[i])[e]&&a.setObjectConfig(e,JSON.parse(t[i])[e],i,!1)}for(let o of e.mapConfig.update){let e=o.split(".")[3],i=o.split(".")[2];if(t[i]&&JSON.parse(t[i])&&JSON.parse(t[i])[e]){let o=JSON.parse(t[i])[e];a.setOneMapConfig(e,o,i,!1)}}}if(e.objectConfig.delete.length>0||e.mapConfig.delete.length>0){for(let t of e.objectConfig.delete){let e=t.split(".")[3],o=t.split(".")[2];a.deleteObjectConfig(e,o)}for(let t of e.mapConfig.delete){let e=t.split(".")[3],o=t.split(".")[2];a.deleteMapConfig(e,o)}}for(let a of h)e[a].upload.length>0&&r.push((()=>n.uploadDatabase(a)));return r.push((()=>n.uploadConfig("config"))),r.push((()=>n.uploadConfig("sync"))),r}))}static syncCover(e,a,t){return m(this,void 0,void 0,(function*(){let t=yield a.getLocalCoverList(),o=yield a.getCloudCoverList(),i=Array.from(new Set([...t,...o])),n=[];for(let r of i)t.includes(r)&&!o.includes(r)&&n.push((()=>a.uploadCover(r))),!t.includes(r)&&o.includes(r)&&"adrive"!==e.getItem("defaultSyncOption")&&n.push((()=>a.downloadCover(r)));return n}))}static syncBook(e,a){return m(this,void 0,void 0,(function*(){let t=yield a.getLocalBookList(),o=yield a.getCloudBookList(),i=[],n=Array.from(new Set([...t,...o]));for(let r of n){if(t.includes(r)&&!o.includes(r)){let e=r.split(".")[0],t=r.split(".")[1];i.push((()=>a.uploadBook(e,t)))}let n="yes"===e.getReaderConfig("autoOffline");if(!t.includes(r)&&o.includes(r)&&n&&"adrive"!==e.getItem("defaultSyncOption")){let e=r.split(".")[0],t=r.split(".")[1]||"epub";i.push((()=>a.offlineBook(e,t.toUpperCase())))}}return i}))}static runTasksWithLimit(e,a,t){return m(this,void 0,void 0,(function*(){if("ftp"!==t&&"adrive"!==t){const t=[],o=[];for(const i of e){const e=i().then((a=>(o.splice(o.indexOf(e),1),a)));t.push(e),o.push(e),o.length>=a&&(yield Promise.race(o))}return Promise.all(t)}for(let a of e)yield a()}))}}class ve{constructor(e,a){this.bookKey="",this.sessionStart=0,this.unregisterUnload=null,this.configService=e,this.platform=a}getDailySeconds(e,a){const t=((this.configService.getAllMapConfig("readingStats")||{})[a]||[]).find((a=>a.startsWith(e+"-")));if(!t)return 0;const o=t.split("-");return parseInt(o[o.length-1],10)||0}setDailySeconds(e,a,t){const o=(this.configService.getAllMapConfig("readingStats")||{})[a]||[],i=`${e}-${t}`,n=o.filter((a=>!a.startsWith(e+"-")));this.configService.setOneMapConfig(a,[...n,i],"readingStats")}start(e){this.bookKey=e,this.sessionStart=Date.now(),this.unregisterUnload=this.platform.registerUnloadHandler((()=>{var e,a;this.commit(),null===(a=(e=this.platform).onBeforeClose)||void 0===a||a.call(e)}))}stop(){var e;this.commit(),null===(e=this.unregisterUnload)||void 0===e||e.call(this),this.unregisterUnload=null,this.bookKey="",this.sessionStart=0}commit(){if(!this.bookKey||!this.sessionStart)return;const e=Date.now()-this.sessionStart;if(e<1e3)return void(this.sessionStart=0);const a=Math.round(e/1e3);this.sessionStart=0;const t=this.configService.getObjectConfig(this.bookKey,"readingTime",0);this.configService.setObjectConfig(this.bookKey,t+a,"readingTime");const o=function(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}(),i=this.getDailySeconds(this.bookKey,o);this.setDailySeconds(this.bookKey,o,i+a)}getTotalSeconds(e){return this.configService.getObjectConfig(e,"readingTime",0)}getDailySecondsForBook(e,a){return this.getDailySeconds(e,a)}getDayStats(e){return((this.configService.getAllMapConfig("readingStats")||{})[e]||[]).map((e=>{const a=e.lastIndexOf("-");return{bookKey:e.substring(0,a),seconds:parseInt(e.substring(a+1),10)||0}}))}getAllDates(){const e=this.configService.getAllMapConfig("readingStats");return Object.keys(e||{})}}const be="Koodo Reader",ke="application/vnd.koreader.v1+json";class Se extends Error{constructor(e,a,t,o){super(e),this.name="KOReaderRequestError",this.status=a,this.code=t,this.body=o}}const Ee=e=>{const a=(e||"").trim();if(!a)return"";return(/^https?:\/\//i.test(a)?a:`https://${a}`).replace(/\/+$/,"")},Ce=e=>{const a="number"==typeof e?e:parseFloat((e||"0")+"");return!isFinite(a)||isNaN(a)?0:a>1&&a<=100?Math.min(Math.max(a/100,0),1):Math.min(Math.max(a,0),1)},Te=(e,a={})=>m(void 0,void 0,void 0,(function*(){const t=yield fetch(e,a);return t.ok||(yield(e=>m(void 0,void 0,void 0,(function*(){let a=null;try{a=yield e.json()}catch(t){try{a=yield e.text()}catch(e){a=null}}const t=(null==a?void 0:a.message)||(null==a?void 0:a.error)||(null==a?void 0:a.msg)||("string"==typeof a?a:"")||e.statusText||"Request failed";throw console.error(`[KOReader] HTTP ${e.status} error: ${t}`,null!=a?a:"(no body)"),new Se(t,e.status,null==a?void 0:a.code,a)})))(t)),204===t.status?{}:yield t.json()})),we=e=>({Accept:ke,"Content-Type":"application/json","x-auth-user":e.username,"x-auth-key":e.passwordHash});class Ae{constructor(e,a,t){this.getKOReaderSyncConfig=()=>{let e;try{e=this.ConfigService.getObjectConfig("koReaderSyncConfig","thirdpartyToken",{})}catch(e){return console.error("[KOReader] Failed to read koReaderSyncConfig:",e),null}if(!e||"object"!=typeof e)return console.error("[KOReader] koReaderSyncConfig is missing or invalid"),null;const a=Ee(e.serverUrl||""),t=(e.username||"").trim(),o=(e.passwordHash||"").trim();return a&&t&&o?{serverUrl:a,username:t,passwordHash:o}:(console.error("[KOReader] Incomplete config — missing fields"),null)},this.getLocalRecordLocation=e=>this.ConfigService.getObjectConfig(e,"recordLocation",{})||{},this.persistKOReaderMetadata=(e,a,t)=>{const o=Object.assign(Object.assign({},a),{percentage:t.percentage.toString(),xpath:t.progress,timestamp:t.timestamp||parseInt(Date.now()/1e3+"")});this.ConfigService.setObjectConfig(e,o,"recordLocation")},this.authUser=e=>m(this,void 0,void 0,(function*(){return yield Te(`${e.serverUrl}/users/auth`,{method:"GET",headers:we(e)})})),this.createUser=e=>m(this,void 0,void 0,(function*(){return yield Te(`${e.serverUrl}/users/create`,{method:"POST",headers:{Accept:ke,"Content-Type":"application/json"},body:JSON.stringify({username:e.username,password:e.passwordHash})})})),this.getBookProgress=(e,a)=>m(this,void 0,void 0,(function*(){const t=yield Te(`${e.serverUrl}/syncs/progress/${encodeURIComponent(a)}`,{method:"GET",headers:we(e)});return t&&0!==Object.keys(t).length?{document:a,percentage:Ce(t.percentage),progress:t.progress||"",device:t.device||"",device_id:t.device_id||"",timestamp:t.timestamp||0}:null})),this.updateBookProgress=(e,a)=>m(this,void 0,void 0,(function*(){yield Te(`${e.serverUrl}/syncs/progress`,{method:"PUT",headers:we(e),body:JSON.stringify({document:a.document,percentage:a.percentage,progress:a.progress,device:a.device||be,device_id:a.device_id||"",timestamp:a.timestamp||parseInt(Date.now()/1e3+"")})})})),this.buildLocalUploadPayload=(e,a,t,o)=>m(this,void 0,void 0,(function*(){const i=Ce(a.percentage),n=a.xpath||"",r=this.ConfigService.getObjectConfig(e.key,"koreaderBooks",{});if(!r.document){let a=yield o(e);if(!a)return console.error(`[KOReader] Cannot build upload payload for "${e.name}": failed to compute partial MD5`),null;r.document=a,this.ConfigService.setObjectConfig(e.key,r,"koreaderBooks")}return n?{document:r.document,percentage:i,progress:n,device:be,device_id:t,timestamp:a.timestamp||parseInt(Date.now()/1e3+"")}:(console.error(`[KOReader] Cannot build upload payload for "${e.name}": no xpath/progress recorded (localRecord.xpath is empty)`),null)})),this.resolveDeviceId=()=>m(this,void 0,void 0,(function*(){try{return(yield this.TokenService.getFingerprint())||"koodo-reader"}catch(e){return console.error("[KOReader] Failed to get device fingerprint, using fallback ID:",e),"koodo-reader"}})),this.verifyAndBuildKOReaderSyncConfig=e=>m(this,void 0,void 0,(function*(){const a={serverUrl:Ee(e.serverUrl),username:(e.username||"").trim(),passwordHash:(e.password||"").trim()?s.MD5((e.password||"").trim()).toString():(e.passwordHash||"").trim()};if(!a.serverUrl||!a.username||!a.passwordHash)throw new Error("Please fill in all fields");try{return yield this.authUser(a),a}catch(e){console.error(`[KOReader] Auth failed for user "${a.username}" at ${a.serverUrl}, attempting to create user:`,e);try{return yield this.createUser(a),yield this.authUser(a),a}catch(o){if((t=o)instanceof Se&&(2002===t.code||(t.message||"").toLowerCase().includes("already exists")))throw console.error(`[KOReader] User "${a.username}" already exists but auth failed. Original auth error:`,e),e;throw console.error(`[KOReader] Failed to create user "${a.username}":`,o),o}}var t})),this.syncKOReaderProgress=e=>m(this,void 0,void 0,(function*(){const a=this.getKOReaderSyncConfig();if(!a)throw new Error("Please configure the KOReader sync server first");yield this.authUser(a);const t=yield this.resolveDeviceId(),o=(yield this.DatabaseService.getAllRecords("books"))||[],i={checkedBooks:0,matchedBooks:0,pulledBooks:0,pushedBooks:0,skippedBooks:0};for(const n of o)try{i.checkedBooks++;const o=this.getLocalRecordLocation(n.key);if(!o||!o.xpath){console.error(`[KOReader] Skipping "${n.name}": no local reading progress (xpath) found`),i.skippedBooks++;continue}const r=this.ConfigService.getObjectConfig(n.key,"koreaderBooks",{});if(!r.document){let a=yield e(n);if(!a){console.error(`[KOReader] Skipping "${n.name}": failed to compute partial MD5 for document ID`),i.skippedBooks++;continue}r.document=a,this.ConfigService.setObjectConfig(n.key,r,"koreaderBooks")}let l=r.document;const s=yield this.getBookProgress(a,l),d=(null==s?void 0:s.timestamp)||0,c=o.timestamp||0;if(s){if(i.matchedBooks++,d>c)this.persistKOReaderMetadata(n.key,o,s),i.pulledBooks++;else{if(!(d{if("number"!=typeof e){const[a,t]=e.split("-");return{styleType:a,color:t}}if(e>=0&&e-1,t=parseInt(xe[e].split("-")[1]);return{styleType:a?"background":"underline",color:a?Ie[t]:Fe[t]}}return{styleType:"background",color:"#FEF3CD"}},this.formatHighlightValue=e=>`${e.styleType}-${e.color}`,this.getNoteHighlightString=()=>this.ConfigService.getReaderConfig(Me)||"background-#FEF3CD",this.getNoteHighlightValue=()=>{const e=this.getNoteHighlightString();if(!e)return Ue;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveNoteHighlightValue=e=>{this.ConfigService.setReaderConfig(Me,`${e.styleType}-${e.color}`)},this.getTtsHighlightString=()=>this.ConfigService.getReaderConfig(_e)||Re,this.getTtsHighlightValue=()=>{const e=this.getTtsHighlightString();if(!e)return Oe;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveTtsHighlightValue=e=>{this.ConfigService.setReaderConfig(_e,`${e.styleType}-${e.color}`)},this.getSearchHighlightString=()=>this.ConfigService.getReaderConfig($e)||Re,this.getSearchHighlightValue=()=>{const e=this.ConfigService.getReaderConfig($e);if(!e)return Oe;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveSearchHighlightValue=e=>{this.ConfigService.setReaderConfig($e,`${e.styleType}-${e.color}`)},this.buildHighlightStyleForType=(e,a,t)=>{let o="background",i="#FEF3CD";if("number"==typeof e){if(e>=0&&e-1,t=parseInt(xe[e].split("-")[1]);o=a?"background":"underline",i=a?Ie[t]:Fe[t]}}else o=e.split("-")[0],i=e.split("-")[1];const n="background"===o?((e,a)=>{const t=e.replace("#",""),o=3===t.length?t.split("").map((e=>e+e)).join(""):t;return 6!==o.length?e:`rgba(${parseInt(o.slice(0,2),16)}, ${parseInt(o.slice(2,4),16)}, ${parseInt(o.slice(4,6),16)}, ${a})`})(i,.8):i;switch(o){case"background":return a?`background: ${n}; mix-blend-mode: multiply;`:`background: ${n};`;case"underline":return a?t?`border-right: 2px solid ${n};`:`border-bottom: 2px solid ${n};`:`text-decoration: underline; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return a?`background: linear-gradient(transparent calc(50% - 1px), ${n} calc(50% - 1px), ${n} calc(50% + 1px), transparent calc(50% + 1px));`:t?`background: linear-gradient(to right, transparent calc(50% - 1px), ${n} calc(50% - 1px), ${n} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const e=i.replace("#","%23");if(a){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${e}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(t){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${e}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${n};`}},this.buildHighlightPreviewStyle=(e,a)=>{switch(e){case"background":default:return{background:a};case"underline":return{textDecoration:"underline",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"};case"strikethrough":return{textDecoration:"line-through",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"};case"wavy":return{textDecorationLine:"underline",textDecorationStyle:"wavy",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"}}},this.convertNumberToHighlightValue=e=>this.getHighlightValue(e),this.buildTtsHighlightStyle=(e,a)=>this.buildHighlightStyleForType(this.getTtsHighlightString(),e,a),this.buildTtsHighlightPreviewStyle=(e,a)=>this.buildHighlightPreviewStyle(e,a),this.buildSearchHighlightStyle=(e,a)=>this.buildHighlightStyleForType(this.getSearchHighlightString(),e,a),this.buildSearchHighlightPreviewStyle=(e,a)=>this.buildHighlightPreviewStyle(e,a),this.ConfigService=e}}const ze=(De=class{static getItem(e){return localStorage.getItem(e)}static setItem(e,a){localStorage.setItem(e,a)}static removeItem(e){localStorage.removeItem(e)}},Le="browser",class extends De{static getReaderConfig(e){return w.includes(e)&&"undefined"!=typeof window&&window.currentBookKey&&this.getAllListConfig("seperateStyleBooks").includes(window.currentBookKey)?this.getObjectConfig(window.currentBookKey,"seperateStyleConfig",{})[e]:JSON.parse(this.getItem("readerConfig")||"{}")[e]}static setReaderConfig(e,a,t=!0){if(w.includes(e)&&"undefined"!=typeof window&&window.currentBookKey&&this.getAllListConfig("seperateStyleBooks").includes(window.currentBookKey)){let o=this.getObjectConfig(window.currentBookKey,"seperateStyleConfig",{});return o[e]=a,void this.setObjectConfig(window.currentBookKey,o,"seperateStyleConfig",t)}let o=JSON.parse(this.getItem("readerConfig")||"{}");o[e]=a,this.setItem("readerConfig",JSON.stringify(o)),t&&this.setSyncRecord({type:"config",catergory:"readerConfig",name:Le,key:e},{operation:"update",time:Date.now()})}static getAllListConfig(e){return("{}"!==this.getItem(e)&&this.getItem(e)?JSON.parse(this.getItem(e)||""):[])||[]}static deleteListConfig(e,a){let t=this.getAllListConfig(a);const o=t.indexOf(e);o>-1&&t.splice(o,1),this.setAllListConfig(t,a)}static setListConfig(e,a){let t=this.getAllListConfig(a);const o=t.indexOf(e);o>-1?(t.splice(o,1),t.unshift(e)):t.unshift(e),this.setAllListConfig(t,a)}static setAllListConfig(e,a,t=!0){this.setItem(a,JSON.stringify(e)),t&&this.setSyncRecord({type:"config",catergory:"listConfig",name:"general",key:a},{operation:"update",time:Date.now()})}static setObjectConfig(e,a,t,o=!0){let i=this.getAllObjectConfig(t);i[e]=a,o&&this.setSyncRecord({type:"config",catergory:"objectConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllObjectConfig(i,t)}static getObjectConfig(e,a,t){return this.getAllObjectConfig(a)[e]||t}static getAllObjectConfig(e){let a=this.getItem(e);return JSON.parse(a)||{}}static setAllObjectConfig(e,a){this.setItem(a,JSON.stringify(e))}static deleteObjectConfig(e,a){let t=this.getAllObjectConfig(a);delete t[e],this.setSyncRecord({type:"config",catergory:"objectConfig",name:a,key:e},{operation:"delete",time:Date.now()}),this.setAllObjectConfig(t,a)}static getAllMapConfig(e){let a=this.getItem(e);return JSON.parse(a)||{}}static getMapConfig(e,a){return this.getAllMapConfig(a)[e]||[]}static setAllMapConfig(e,a){this.setItem(a,JSON.stringify(e))}static setMapConfig(e,a,t){let o=this.getAllMapConfig(t);void 0===o[e]&&(o[e]=[]),a&&-1===o[e].indexOf(a)&&o[e].unshift(a),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,t)}static setOneMapConfig(e,a,t,o=!0){let i=this.getAllMapConfig(t);i[e]=a,o&&this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(i,t)}static deleteFromMapConfig(e,a,t){let o=this.getAllMapConfig(t),i=o[e].indexOf(a);o[e].splice(i,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,t)}static deleteFromAllMapConfig(e,a){let t=this.getAllMapConfig(a);Object.keys(t).forEach((o=>{let i=t[o].indexOf(e);i>-1&&(t[o].splice(i,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:a,key:o},{operation:"update",time:Date.now()}))})),this.setAllMapConfig(t,a)}static deleteMapConfig(e,a){let t=this.getAllMapConfig(a);delete t[e],this.setSyncRecord({type:"config",catergory:"mapConfig",name:a,key:e},{operation:"delete",time:Date.now()}),this.setAllMapConfig(t,a)}static getFromAllMapConfig(e,a){let t=this.getAllMapConfig(a),o=[];for(let a in t)t[a]&&t[a].indexOf(e)>-1&&o.push(a);return o}static getSyncRecord(e){return JSON.parse(this.getItem("syncRecord")||"{}")[e.type+"."+e.catergory+"."+e.name+"."+e.key]||{operation:"",time:0}}static getAllSyncRecord(){return JSON.parse(this.getItem("syncRecord")||"{}")}static setSyncRecord(e,a){const t=e.type+"."+e.catergory+"."+e.name+"."+e.key;let o=JSON.parse(this.getItem("syncRecord")||"{}");o[t]=a,this.setItem("syncRecord",JSON.stringify(o))}static setAllSyncRecord(e){this.setItem("syncRecord",JSON.stringify(e))}});var De,Le;class Pe{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("notionSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Notion] notionSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Notion] Failed to read notionSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableNotionSync")}resolveDatabaseId(e,a){return m(this,void 0,void 0,(function*(){const t=yield fetch(`https://api.notion.com/v1/blocks/${a}/children`,{method:"GET",headers:{Authorization:`Bearer ${e}`,"Notion-Version":"2022-06-28"}});if(!t.ok){const e=yield t.json().catch((()=>null));throw console.error(`[Notion] resolveDatabaseId failed for page ${a}: HTTP ${t.status} ${t.statusText}`,JSON.stringify(e)),new Error(`Notion resolve database error: ${t.status} ${t.statusText}`)}const o=yield t.json(),i=(o.results||[]).find((e=>"child_database"===e.type));if(!i)throw console.error(`[Notion] No child_database block found under page ${a}. Available block types:`,JSON.stringify((o.results||[]).map((e=>e.type)))),new Error(`No child database found in page ${a}. Please provide a Database ID directly.`);return i.id}))}findOrCreatePage(e,a,t){return m(this,void 0,void 0,(function*(){const o=`${t}`,i=yield fetch(`https://api.notion.com/v1/databases/${a}/query`,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({filter:{property:"title",title:{equals:o}}})});if(!i.ok){const o=yield i.json().catch((()=>({})));if(400===i.status&&"validation_error"===(null==o?void 0:o.code)&&"string"==typeof(null==o?void 0:o.message)&&o.message.includes("is a page, not a database")){console.error(`[Notion] Provided databaseId "${a}" is a page, not a database. Resolving child database...`);const o=yield this.resolveDatabaseId(e,a);return this.findOrCreatePage(e,o,t)}throw console.error(`[Notion] Database query failed for databaseId "${a}" (book: "${t}"): HTTP ${i.status} ${i.statusText}`,JSON.stringify(o)),new Error(`Notion API error: ${i.status} ${i.statusText}`)}const n=yield i.json();if(n.results&&n.results.length>0)return n.results[0].id;const r=yield fetch("https://api.notion.com/v1/pages",{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({parent:{database_id:a},properties:{title:{title:[{text:{content:o}}]}}})});if(!r.ok){const e=yield r.json().catch((()=>null));throw console.error(`[Notion] Failed to create page for book "${t}" in database "${a}": HTTP ${r.status} ${r.statusText}`,JSON.stringify(e)),new Error(`Notion create page error: ${r.status} ${r.statusText}`)}return(yield r.json()).id}))}appendBlocks(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=!t.notes||0===t.notes.length,n=[];n.push({object:"block",type:"divider",divider:{}}),o&&n.push({object:"block",type:"heading_3",heading_3:{rich_text:[{type:"text",text:{content:o}}]}}),n.push({object:"block",type:"quote",quote:{rich_text:[{type:"text",text:{content:t.text||""}}]}}),!i&&t.notes&&n.push({object:"block",type:"paragraph",paragraph:{rich_text:[{type:"text",text:{content:`📝 ${t.notes}`}}]}});const r=`${t.date.year}-${String(t.date.month).padStart(2,"0")}-${String(t.date.day).padStart(2,"0")}`;n.push({object:"block",type:"paragraph",paragraph:{rich_text:[{type:"text",text:{content:`Added on ${r}`},annotations:{italic:!0,color:"gray"}}]}});const l=yield fetch(`https://api.notion.com/v1/blocks/${a}/children`,{method:"PATCH",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({children:n})});if(!l.ok){const e=yield l.json().catch((()=>null));throw console.error(`[Notion] Failed to append blocks to page ${a}: HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),new Error(`Notion append blocks error: ${l.status} ${l.statusText}`)}}))}syncNote(e,a){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const t=this.getConfig();if(!t)return!1;try{const o=yield this.findOrCreatePage(t.token,t.databaseId,a);return yield this.appendBlocks(t.token,o,e,e.chapter||""),!0}catch(e){return console.error(`[Notion] Sync failed for book "${a}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class je{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("yuqueSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Yuque] yuqueSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Yuque] Failed to read yuqueSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableYuqueSync")}generateDocSlug(e){return m(this,void 0,void 0,(function*(){const a=(e||"").trim()||"untitled",t=a.toLowerCase().replace(/[^a-z0-9_.-]/g,"-").replace(/[-_.]{2,}/g,"-").replace(/^[-_.]+|[-_.]+$/g,"")||"book",o=(yield y(a)).slice(0,16),i=t,n=190-o.length-1;return`${i.substring(0,n).replace(/^[-_.]+|[-_.]+$/g,"")||"book"}-${o}`}))}findOrCreateDoc(e,a,t){return m(this,void 0,void 0,(function*(){const o=`${t}`,i=yield this.generateDocSlug(t);try{const t=yield fetch(`${je.API_BASE}/repos/${a}/docs/${i}`,{method:"GET",headers:{"X-Auth-Token":e,"Content-Type":"application/json"}});if(t.ok){const e=yield t.json();return{id:e.data.id,slug:e.data.slug,body:e.data.body||""}}if(404!==t.status){const e=yield t.json().catch((()=>null));console.error(`[Yuque] Unexpected error fetching doc "${i}" in repo "${a}": HTTP ${t.status} ${t.statusText}`,JSON.stringify(e))}}catch(e){console.error(`[Yuque] Network error fetching doc "${i}" in repo "${a}":`,JSON.stringify(e))}const n=yield fetch(`${je.API_BASE}/repos/${a}/docs`,{method:"POST",headers:{"X-Auth-Token":e,"Content-Type":"application/json"},body:JSON.stringify({title:o,slug:i,body:`# ${o}\n\n`,format:"markdown"})});if(!n.ok){const e=yield n.json().catch((()=>null));throw console.error(`[Yuque] Failed to create doc "${o}" in repo "${a}": HTTP ${n.status} ${n.statusText}`,JSON.stringify(e)),new Error(`Yuque create doc error: ${n.status} ${n.statusText}`)}const r=yield n.json();return{id:r.data.id,slug:r.data.slug,body:r.data.body||""}}))}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="\n---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}updateDoc(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${je.API_BASE}/repos/${a}/docs/${t}`,{method:"PUT",headers:{"X-Auth-Token":e,"Content-Type":"application/json"},body:JSON.stringify({body:o,format:"markdown"})});if(!i.ok){const e=yield i.json().catch((()=>null));throw console.error(`[Yuque] Failed to update doc ${t} in repo "${a}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),new Error(`Yuque update doc error: ${i.status} ${i.statusText}`)}}))}syncNote(e,a){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const t=this.getConfig();if(!t)return!1;try{const o=yield this.findOrCreateDoc(t.token,t.namespace,a),i=this.formatNoteMarkdown(e),n=o.body+i;return yield this.updateDoc(t.token,t.namespace,o.id,n),!0}catch(e){return console.error(`[Yuque] Sync failed for book "${a}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}je.API_BASE="https://www.yuque.com/api/v2";class Ke{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("readwiseSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Readwise] readwiseSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Readwise] Failed to read readwiseSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableReadwiseSync")}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=`${a}`,n=!e.notes||0===e.notes.length,r={text:e.text||"",title:i,author:t||"Unknown",source_type:"koodo-reader",category:"books",highlighted_at:`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`};if(!n&&e.notes&&(r.note=e.notes),e.chapter){const a=parseInt(e.chapter,10);isNaN(a)||(r.location_type="order",r.location=a)}try{const e=yield fetch(`${Ke.API_BASE}/highlights/`,{method:"POST",headers:{Authorization:`Token ${o.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({highlights:[r]})});if(!e.ok){const a=yield e.json().catch((()=>null));throw console.error(`[Readwise] Failed to sync highlight for book "${i}": HTTP ${e.status} ${e.statusText}`,JSON.stringify(a)),new Error(`Readwise API error: ${e.status} ${e.statusText}`)}return!0}catch(a){return console.error(`[Readwise] Sync failed for book "${i}" (text: "${(e.text||"").substring(0,50)}..."):`,JSON.stringify(a instanceof Error?a.message:a)),!1}}))}}Ke.API_BASE="https://readwise.io/api/v2";class He{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("imaSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[IMA] imaSyncConfig is empty or not set"),null):e}catch(e){return console.error("[IMA] Failed to read imaSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableImaSync")}getHeaders(e){return{"Content-Type":"application/json","ima-openapi-clientid":e.clientId,"ima-openapi-apikey":e.apiKey}}formatNoteMarkdown(e,a,t){const o=!e.notes||0===e.notes.length,i=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let n="\n---\n\n";return e.chapter&&(n+=`### ${e.chapter}\n\n`),n+=`> ${e.text||""}\n\n`,!o&&e.notes&&(n+=`**Note:** ${e.notes}\n\n`),n+=`*${i}*\n`,n}findNoteByTitle(e,a){var t,o,i,n;return m(this,void 0,void 0,(function*(){try{const r=JSON.stringify({search_type:0,query_info:{title:a},start:0,end:20}),l=yield fetch(`${He.API_BASE}/search_note`,{method:"POST",headers:this.getHeaders(e),body:r});if(!l.ok){const e=yield l.json().catch((()=>null));return console.error(`[IMA] search_note failed for title "${a}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),null}const s=yield l.json();if(0!==s.code)return console.error(`[IMA] search_note returned error code ${s.code} for title "${a}":`,JSON.stringify(null!==(t=s.msg)&&void 0!==t?t:s)),null;const d=((null===(o=s.data)||void 0===o?void 0:o.search_note_infos)||[]).find((e=>{var t;return a.includes(null===(t=e.note_book_info)||void 0===t?void 0:t.title.replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu,""))}));return null!==(n=null===(i=null==d?void 0:d.note_book_info)||void 0===i?void 0:i.note_id)&&void 0!==n?n:null}catch(e){return console.error(`[IMA] Network error in search_note for title "${a}":`,JSON.stringify(e)),null}}))}createNote(e,a,t){var o,i,n;return m(this,void 0,void 0,(function*(){try{const r={content_format:1,content:`# ${a}\n\n${t}`};e.folderId&&(r.folder_id=e.folderId);const l=yield fetch(`${He.API_BASE}/import_doc`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify(r)});if(!l.ok){const e=yield l.json().catch((()=>null));return console.error(`[IMA] import_doc failed for note "${a}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),null}const s=yield l.json();return 0!==s.code?(console.error(`[IMA] import_doc returned error code ${s.code} for note "${a}":`,JSON.stringify(null!==(o=s.msg)&&void 0!==o?o:s)),null):null!==(n=null===(i=s.data)||void 0===i?void 0:i.note_id)&&void 0!==n?n:null}catch(e){return console.error(`[IMA] Network error in import_doc for note "${a}":`,JSON.stringify(e)),null}}))}appendNote(e,a,t){var o;return m(this,void 0,void 0,(function*(){try{const i=yield fetch(`${He.API_BASE}/append_doc`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify({note_id:a,content_format:1,content:t})});if(!i.ok){const e=yield i.json().catch((()=>null));return console.error(`[IMA] append_doc failed for noteId "${a}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),!1}const n=yield i.json();return 0===n.code||(console.error(`[IMA] append_doc returned error code ${n.code} for noteId "${a}":`,JSON.stringify(null!==(o=n.msg)&&void 0!==o?o:n)),!1)}catch(e){return console.error(`[IMA] Network error in append_doc for noteId "${a}":`,JSON.stringify(e)),!1}}))}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=this.formatNoteMarkdown(e,a,t);let n=yield this.findNoteByTitle(o,a);if(n){const e=yield this.appendNote(o,n,i);return e||console.error(`[IMA] Failed to append to existing note "${a}" (noteId: ${n})`),e}return n=yield this.createNote(o,a,i),n||console.error(`[IMA] Failed to create note for book "${a}"`),null!==n}))}}He.API_BASE="https://ima.qq.com/openapi/note/v1";class Je{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("siyuanSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[SiYuan] siyuanSyncConfig is empty or not set"),null):e}catch(e){return console.error("[SiYuan] Failed to read siyuanSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableSiYuanSync")}getHeaders(e){return{"Content-Type":"application/json",Authorization:`Token ${e}`}}findOrCreateNotebook(e,a){var t,o;return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/notebook/lsNotebooks`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({})});if(!i.ok){const a=yield i.json().catch((()=>null));throw console.error(`[SiYuan] lsNotebooks failed at ${e}: HTTP ${i.status} ${i.statusText}`,JSON.stringify(a)),new Error(`SiYuan list notebooks failed: ${i.status} ${i.statusText}`)}const n=yield i.json();if(0!==n.code)throw console.error(`[SiYuan] lsNotebooks returned error code ${n.code}:`,JSON.stringify(n.msg)),new Error(`SiYuan list notebooks error: ${n.msg}`);const r=(null!==(o=null===(t=n.data)||void 0===t?void 0:t.notebooks)&&void 0!==o?o:[]).find((e=>"Koodo Reader"===e.name));if(r)return r.id;const l=yield fetch(`${e}/api/notebook/createNotebook`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({name:"Koodo Reader"})});if(!l.ok){const a=yield l.json().catch((()=>null));throw console.error(`[SiYuan] createNotebook failed at ${e}: HTTP ${l.status} ${l.statusText}`,JSON.stringify(a)),new Error(`SiYuan create notebook failed: ${l.status} ${l.statusText}`)}const s=yield l.json();if(0!==s.code)throw console.error(`[SiYuan] createNotebook returned error code ${s.code}:`,JSON.stringify(s.msg)),new Error(`SiYuan create notebook error: ${s.msg}`);return s.data.notebook.id}))}findOrCreateDoc(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/query/sql`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({stmt:`SELECT id FROM blocks WHERE type='d' AND hpath='${o.replace(/'/g,"''")}' LIMIT 1`})});if(i.ok){const e=yield i.json();if(0!==e.code)console.error(`[SiYuan] SQL query for doc "${o}" returned error code ${e.code}:`,JSON.stringify(e.msg));else if(e.data&&e.data.length>0)return e.data[0].id}else{const e=yield i.json().catch((()=>null));console.error(`[SiYuan] SQL query for doc "${o}" failed: HTTP ${i.status} ${i.statusText}`,JSON.stringify(e))}const r=n?`**Author:** ${n}\n`:"",l=yield fetch(`${e}/api/filetree/createDocWithMd`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({notebook:t,path:o,markdown:r})});if(!l.ok){const e=yield l.json().catch((()=>null));throw console.error(`[SiYuan] createDocWithMd failed for "${o}" in notebook "${t}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),new Error(`SiYuan create doc failed: ${l.status} ${l.statusText}`)}const s=yield l.json();if(0!==s.code)throw console.error(`[SiYuan] createDocWithMd returned error code ${s.code} for "${o}":`,JSON.stringify(s.msg)),new Error(`SiYuan create doc error: ${s.msg}`);return s.data}))}appendMarkdownToDoc(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/block/appendBlock`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({data:o,dataType:"markdown",parentID:t})});if(!i.ok){const e=yield i.json().catch((()=>null));throw console.error(`[SiYuan] appendBlock failed for docId "${t}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),new Error(`SiYuan append block failed: ${i.status} ${i.statusText}`)}const n=yield i.json();if(0!==n.code)throw console.error(`[SiYuan] appendBlock returned error code ${n.code} for docId "${t}":`,JSON.stringify(n.msg)),new Error(`SiYuan append block error: ${n.msg}`)}))}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}sanitizePathComponent(e){return e.replace(/[\\/:*?"<>|]/g,"_").trim()}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const{serverUrl:i,token:n}=o;if(!i||!n)return console.error("[SiYuan] Sync skipped: config is missing serverUrl or token",JSON.stringify({hasServerUrl:!!i,hasToken:!!n})),!1;try{const o=yield this.findOrCreateNotebook(i,n),r=`/${this.sanitizePathComponent(a)}`,l=yield this.findOrCreateDoc(i,n,o,r,a,t),s=this.formatNoteMarkdown(e);return yield this.appendMarkdownToDoc(i,n,l,s),!0}catch(e){return console.error(`[SiYuan] Sync failed for book "${a}" at ${o.serverUrl}:`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class We{constructor(e,a){this.databaseService=e,this.notionSync=new Pe(a),this.yuqueSync=new je(a),this.readwiseSync=new Ke(a),this.imaSync=new He(a),this.siyuanSync=new Je(a)}getExtraServices(){return[]}getEnabledServices(){const e=[];return this.notionSync.isEnabled()&&e.push({name:"Notion",sync:this.notionSync.syncNote.bind(this.notionSync)}),this.yuqueSync.isEnabled()&&e.push({name:"Yuque",sync:this.yuqueSync.syncNote.bind(this.yuqueSync)}),this.readwiseSync.isEnabled()&&e.push({name:"Readwise",sync:this.readwiseSync.syncNote.bind(this.readwiseSync)}),this.imaSync.isEnabled()&&e.push({name:"IMA",sync:this.imaSync.syncNote.bind(this.imaSync)}),this.siyuanSync.isEnabled()&&e.push({name:"SiYuan",sync:this.siyuanSync.syncNote.bind(this.siyuanSync)}),[...e,...this.getExtraServices()]}syncNote(e,a){return m(this,void 0,void 0,(function*(){const t=this.getEnabledServices();if(0===t.length)return;let o="Unknown Book",i="";if(a||e.bookKey)try{const t=yield this.databaseService.getRecord(a||e.bookKey,"books");t&&t.name&&(o=t.name),t&&t.author&&(i=t.author)}catch(t){console.error(`[NoteSync] Failed to resolve book info for key: ${a||e.bookKey}`,JSON.stringify(t))}const n=(yield Promise.allSettled(t.map((a=>m(this,void 0,void 0,(function*(){var t,n,r,l;try{const r=yield a.sync(e,o,i);return r||console.error(`[NoteSync] ${a.name} sync returned false for book "${o}" (noteId: ${null!==(n=null!==(t=e.noteKey)&&void 0!==t?t:e.key)&&void 0!==n?n:"unknown"})`),{name:a.name,success:r}}catch(t){return console.error(`[NoteSync] ${a.name} sync threw an error for book "${o}" (noteId: ${null!==(l=null!==(r=e.noteKey)&&void 0!==r?r:e.key)&&void 0!==l?l:"unknown"}):`,JSON.stringify(t)),{name:a.name,success:!1}}})))))).filter((e=>"rejected"===e.status||"fulfilled"===e.status&&!e.value.success)).map((e=>"fulfilled"===e.status?e.value.name:"Unknown"));n.length>0&&console.error(`[NoteSync] Sync failed for services: ${n.join(", ")} | book: "${o}"`)}))}}class qe{constructor(e,a,t){this.configService=e,this.fs=a,this.path=t}getConfig(){try{const e=this.configService.getObjectConfig("markdownSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Markdown] markdownSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Markdown] Failed to read markdownSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableMarkdownSync")}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="\n---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}sanitizeFileName(e){return e.replace(/[\\/:*?"<>|]/g,"_").trim()}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=o.folder;if(!i)return console.error("[Markdown] Sync skipped: markdownSyncConfig.folder is not set"),!1;const n=this.fs,r=this.path;try{const o=this.sanitizeFileName(a),l=r.join(i,`${o}.md`);if(!n.existsSync(l)){const e=`# ${a}\n`,o=t?`**Author:** ${t}\n\n`:"\n";try{n.writeFileSync(l,e+o,"utf-8")}catch(e){return console.error(`[Markdown] Failed to create file "${l}" for book "${a}":`,JSON.stringify(e)),!1}}const s=this.formatNoteMarkdown(e);try{n.appendFileSync(l,s,"utf-8")}catch(e){return console.error(`[Markdown] Failed to append to file "${l}" for book "${a}":`,JSON.stringify(e)),!1}return!0}catch(e){return console.error(`[Markdown] Sync failed for book "${a}" in folder "${i}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class Ge extends We{constructor(e,a,t,o){super(e,a),this.markdownSync=new qe(a,t,o)}getExtraServices(){return this.markdownSync.isEnabled()?[{name:"Markdown",sync:this.markdownSync.syncNote.bind(this.markdownSync)}]:[]}}class Qe{constructor(a){this.syncWordToEudic=(a,t)=>m(this,void 0,void 0,(function*(){var o,i,n,r,l,s,d,c,u,m;if("yes"===this.configService.getReaderConfig("isEnableEudicSync"))try{let c;try{c=this.configService.getObjectConfig("eudicSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[Eudic] Failed to read eudicSyncConfig:",JSON.stringify(e))}if(!c||!c.accessToken)return void console.error("[Eudic] Sync skipped: config is missing or accessToken is not set",JSON.stringify({hasConfig:!!c}));const u=c.language||"en",m={Authorization:`NIS ${c.accessToken}`,"Content-Type":"application/json","User-Agent":"Mozilla/5.0"};let p="0";const h=(c.categoryName||"").trim();if(h)if(void 0!==c.categoryId)p=c.categoryId;else try{const a=(null===(o=(yield e.get(`https://api.frdic.com/api/open/v1/studylist/category?language=${u}`,{headers:m})).data)||void 0===o?void 0:o.data)||[],t=a.find((e=>e.name===h));t?p=t.id:console.error(`[Eudic] Category "${h}" not found among available categories:`,JSON.stringify(a.map((e=>e.name))));const i=Object.assign(Object.assign({},c),{categoryId:p});this.configService.setObjectConfig("eudicSyncConfig",i,"thirdpartyToken")}catch(e){console.error("[Eudic] Failed to fetch category list:",null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.status,JSON.stringify(null!==(r=null===(n=null==e?void 0:e.response)||void 0===n?void 0:n.data)&&void 0!==r?r:e))}try{yield e.post("https://api.frdic.com/api/open/v1/studylist/word",{language:u,word:a,context_line:t||"",category_ids:[p]},{headers:m})}catch(e){throw console.error(`[Eudic] Failed to add word "${a}" to study list (category: ${p}):`,null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,JSON.stringify(null!==(d=null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.data)&&void 0!==d?d:e)),e}}catch(e){console.error("[Eudic] Sync error for word:",a,null===(c=null==e?void 0:e.response)||void 0===c?void 0:c.status,JSON.stringify(null!==(m=null===(u=null==e?void 0:e.response)||void 0===u?void 0:u.data)&&void 0!==m?m:e))}})),this.syncWordToAnki=(a,t,o,i,n="")=>m(this,void 0,void 0,(function*(){var r,l,s,d,c,u,m,p,h,g;if("yes"===this.configService.getReaderConfig("isEnableAnkiSync"))try{let h;try{h=this.configService.getObjectConfig("ankiSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[Anki] Failed to read ankiSyncConfig:",JSON.stringify(e))}if(!h||!h.deckName)return void console.error("[Anki] Sync skipped: config is missing or deckName is not set",JSON.stringify({hasConfig:!!h}));const g=h.host||"127.0.0.1",f=`http://${g}:${h.port||"8765"}`,y=h.deckName,N="Koodo Reader Word",v=(a,t={})=>{const o={action:a,version:6,params:t};return h.apiKey&&(o.key=h.apiKey),e.post(f,o)};if(!h.modelName)try{const e=yield v("modelNames");if(!((null===(r=e.data)||void 0===r?void 0:r.result)||[]).includes(N))try{yield v("createModel",{modelName:N,inOrderFields:["Word","Sentence","Book","Chapter","Definition"],cardTemplates:[{Name:"Card 1",Front:"{{Word}}

{{Sentence}}

{{Book}}
{{Chapter}}",Back:"{{Definition}}"}]})}catch(e){throw console.error(`[Anki] Failed to create model "${N}":`,JSON.stringify(null!==(s=null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.data)&&void 0!==s?s:e)),e}this.configService.setObjectConfig("ankiSyncConfig",Object.assign(Object.assign({},h),{modelName:N}),"thirdpartyToken")}catch(e){throw console.error(`[Anki] Failed to fetch model names from ${f}:`,JSON.stringify(null!==(c=null===(d=null==e?void 0:e.response)||void 0===d?void 0:d.data)&&void 0!==c?c:e)),e}try{const e=yield v("addNote",{note:{deckName:y,modelName:N,fields:{Word:a,Sentence:t||"",Book:o||"",Chapter:i||"",Definition:n||""},options:{allowDuplicate:!1},tags:[]}});(null===(u=e.data)||void 0===u?void 0:u.error)&&console.error(`[Anki] addNote returned an error for word "${a}" in deck "${y}":`,JSON.stringify(e.data.error))}catch(e){throw console.error(`[Anki] Failed to add note for word "${a}" to deck "${y}" at ${f}:`,JSON.stringify(null!==(p=null===(m=null==e?void 0:e.response)||void 0===m?void 0:m.data)&&void 0!==p?p:e)),e}}catch(e){console.error("[Anki] Sync error for word:",a,JSON.stringify(null!==(g=null===(h=null==e?void 0:e.response)||void 0===h?void 0:h.data)&&void 0!==g?g:e))}})),this.syncWordToMaiMemo=a=>m(this,void 0,void 0,(function*(){var t,o,i,n,r,l,s,d,c,u,m,p,h,g,f,y,N,v,b,k;if("yes"===this.configService.getReaderConfig("isEnableMaiMemoSync"))try{let v;try{v=this.configService.getObjectConfig("maimemoSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[MaiMemo] Failed to read maimemoSyncConfig:",JSON.stringify(e))}if(!v||!v.accessToken||!v.notepadName)return void console.error("[MaiMemo] Sync skipped: config is missing accessToken or notepadName",JSON.stringify({hasConfig:!!v}));const b=v.accessToken,k=v.notepadName.trim(),S={Authorization:`Bearer ${b}`,"Content-Type":"application/json",Accept:"application/json"};let E=v.notepadId||"";if(!E)try{const l=yield e.get("https://open.maimemo.com/open/api/v1/memo/notepads",{headers:S}),s=((null===(o=null===(t=l.data)||void 0===t?void 0:t.data)||void 0===o?void 0:o.notepads)||[]).find((e=>"PUBLISHED"===e.status&&e.title===k));if(s)E=s.id;else{if(E=null===(r=null===(n=null===(i=(yield e.post("https://open.maimemo.com/open/api/v1/memo/notepads",{notepad:{status:"PUBLISHED",content:a,title:k,brief:k,tags:[]}},{headers:S})).data)||void 0===i?void 0:i.data)||void 0===n?void 0:n.notepad)||void 0===r?void 0:r.id,!E)return void console.error("[MaiMemo] Created notepad but no id returned")}this.configService.setObjectConfig("maimemoSyncConfig",Object.assign(Object.assign({},v),{notepadId:E}),"thirdpartyToken")}catch(e){return void console.error("[MaiMemo] Failed to resolve notepadId:",null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,JSON.stringify(null!==(d=null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.data)&&void 0!==d?d:e))}try{let t="";try{t=(null===(m=null===(u=null===(c=(yield e.get(`https://open.maimemo.com/open/api/v1/memo/notepads/${E}`,{headers:S})).data)||void 0===c?void 0:c.data)||void 0===u?void 0:u.notepad)||void 0===m?void 0:m.content)||""}catch(e){return void console.error("[MaiMemo] Failed to fetch notepad content:",null===(p=null==e?void 0:e.response)||void 0===p?void 0:p.status,JSON.stringify(null!==(g=null===(h=null==e?void 0:e.response)||void 0===h?void 0:h.data)&&void 0!==g?g:e))}const o=t.split("\n").map((e=>e.trim())).filter((e=>e.length>0));if(o.includes(a))return;o.push(a),yield e.post(`https://open.maimemo.com/open/api/v1/memo/notepads/${E}`,{id:E,notepad:{status:"PUBLISHED",content:o.join("\n"),title:k,brief:k,tags:[]}},{headers:S})}catch(e){throw console.error(`[MaiMemo] Failed to add word "${a}" to notepad "${k}" (${E}):`,null===(f=null==e?void 0:e.response)||void 0===f?void 0:f.status,JSON.stringify(null!==(N=null===(y=null==e?void 0:e.response)||void 0===y?void 0:y.data)&&void 0!==N?N:e)),e}}catch(e){console.error("[MaiMemo] Sync error for word:",a,null===(v=null==e?void 0:e.response)||void 0===v?void 0:v.status,JSON.stringify(null!==(k=null===(b=null==e?void 0:e.response)||void 0===b?void 0:b.data)&&void 0!==k?k:e))}})),this.configService=a}}class Ye extends Qe{}export{S as CommonTool,ze as ConfigService,Be as HighlightUtil,Ae as KOReaderUtil,A as KookitConfig,ye as LoginHelper,Ge as NoteSyncManager,he as ReaderRequest,ve as ReadingTimeUtil,ce as SqlStatement,Ne as SyncHelper,oe as SyncUtil,ge as ThirdpartyRequest,fe as UserRequest,Ye as WordSyncManager}; diff --git a/src/assets/lib/kookit.min.js b/src/assets/lib/kookit.min.js index 7cd0b55e..c18adceb 100644 --- a/src/assets/lib/kookit.min.js +++ b/src/assets/lib/kookit.min.js @@ -1 +1 @@ -import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();if(0===rect.width||0===rect.height)return!1;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{resolved||(resolved=!0,docElement.style.willChange="",docElement.style.transform="",docElement.style.transition="",body.scrollLeft=snapX,Math.abs(body.scrollLeft-snapX)>.5?requestAnimationFrame(()=>{body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1}):(render.record(),isDragging=!1,window.isSwiping=!1))},onTransitionEnd=e=>{e.target===docElement&&"transform"===e.propertyName&&(docElement.removeEventListener("transitionend",onTransitionEnd),cleanup())};docElement.addEventListener("transitionend",onTransitionEnd),window.scrollAnimationId=setTimeout(cleanup,300)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.quickErase="no",this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.quickErase=config.quickErase||"no",this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),config.quickErase&&this.setQuickErase(config.quickErase),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),"yes"===this.quickErase)canvas.remove(obj);else if(this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setQuickErase(quickErase){this.quickErase=quickErase}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),this.trigger("chapter-pages"),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getPages(){return this.chapterDocList.map((_item,index)=>index+1)}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterSizeCache=null,this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; +import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();if(0===rect.width||0===rect.height)return!1;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{if(resolved)return;null===startTime&&(startTime=now);const progress=Math.min(1,(now-startTime)/250);body.scrollLeft=startLeft+distance*(t=>1-Math.pow(1-t,3))(progress),progress<1?window.scrollAnimationId=requestAnimationFrame(step):resolved||(resolved=!0,body.style.willChange="",body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1)};window.scrollAnimationId=requestAnimationFrame(step)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.quickErase="no",this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.quickErase=config.quickErase||"no",this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),config.quickErase&&this.setQuickErase(config.quickErase),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),"yes"===this.quickErase)canvas.remove(obj);else if(this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setQuickErase(quickErase){this.quickErase=quickErase}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),this.trigger("chapter-pages"),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getPages(){return this.chapterDocList.map((_item,index)=>index+1)}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterSizeCache=null,this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; diff --git a/src/assets/locales/zh-CN.json b/src/assets/locales/zh-CN.json index f2c22401..c65c173a 100644 --- a/src/assets/locales/zh-CN.json +++ b/src/assets/locales/zh-CN.json @@ -472,6 +472,7 @@ "Copying successful": "复制成功", "Copy ": "复制", "Do you want to download and import the book from this URL?": "您是否要从此 URL 下载并导入图书?", + "No path found for this book": "未找到此图书的路径", "Import cancelled": "导入已取消", "Text color": "文字颜色", "Eraser": "橡皮擦", From 6738fcdfd21e5a3c4eb344b0c3f1abc374a04a76 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Sat, 3 Oct 2026 17:22:26 +0800 Subject: [PATCH 29/42] Remove console log for user info during answer reporting in PopupAssist component --- package.json | 2 +- src/assets/lib/kookit-extra-browser.min.js | 2 +- src/assets/lib/kookit-extra.min.mjs | 2 +- src/components/popups/popupAssist/component.tsx | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 1a0c7fbd..772d1ac7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "koodo-reader", "main": "main.js", - "version": "2.4.5", + "version": "2.4.6", "description": "Koodo Reader is a cross-platform ebook reader", "author": { "name": "App by Troye", diff --git a/src/assets/lib/kookit-extra-browser.min.js b/src/assets/lib/kookit-extra-browser.min.js index ede57818..5f4524f7 100644 --- a/src/assets/lib/kookit-extra-browser.min.js +++ b/src/assets/lib/kookit-extra-browser.min.js @@ -1 +1 @@ -import e from"axios";import{Storage as a}from"megajs";import{Buffer as t}from"buffer";import{S3Client as o,ListObjectsV2Command as i,DeleteObjectCommand as n,PutObjectCommand as r,GetObjectCommand as l}from"@aws-sdk/client-s3";import s from"crypto-js";import{AuthType as d,createClient as c}from"webdav/dist/web/index.js";import{SSE as u}from"sse.js";function m(e,a,t,o){return new(t||(t=Promise))((function(i,n){function r(e){try{s(o.next(e))}catch(e){n(e)}}function l(e){try{s(o.throw(e))}catch(e){n(e)}}function s(e){var a;e.done?i(e.value):(a=e.value,a instanceof t?a:new t((function(e){e(a)}))).then(r,l)}s((o=o.apply(e,a||[])).next())}))}const p=e=>"json"===e?"application/json":["jpg","jpeg","png","gif","bmp"].includes(e)?"image/"+e:"zip"===e?"application/zip":"epub"===e?"application/epub+zip":"txt"===e?"text/plain":"pdf"===e?"application/pdf":"mobi"===e?"application/x-mobipocket-ebook":"azw3"===e||"azw"===e?"application/vnd.amazon.ebook":"cbz"===e?"application/x-cbz":"cbr"===e?"application/x-cbr":"cbt"===e?"application/x-cbt":"cb7"===e?"application/x-cb7":"fb2"===e?"application/x-fictionbook+xml":"html"===e?"text/html":"css"===e?"text/css":"js"===e?"application/javascript":"xml"===e?"application/xml":"xhtml"===e?"application/xhtml+xml":"opf"===e?"application/oebps-package+xml":"ncx"===e?"application/x-dtbncx+xml":"mp3"===e?"audio/mpeg":"wav"===e?"audio/wav":"ogg"===e?"audio/ogg":"mp4"===e?"video/mp4":"webm"===e?"video/webm":"avi"===e?"video/x-msvideo":"wmv"===e?"video/x-ms-wmv":"flv"===e?"video/x-flv":"m3u8"===e?"application/x-mpegURL":"ts"===e?"video/MP2T":"3gp"===e?"video/3gpp":"3g2"===e?"video/3gpp2":"db"===e?"application/x-sqlite3":void 0,h=["books","notes","bookmarks","plugins","words"],g=e=>{const a=atob(e),t=a.length,o=new Uint8Array(t);for(let e=0;e{let a="";const t=new Uint8Array(e),o=t.byteLength;for(let e=0;ee.toString(16).padStart(2,"0"))).join("")}))}function N(e){const a=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],t=(e,a)=>e>>>a|e<<32-a,o=(e,a,t)=>e&a^~e&t,i=(e,a,t)=>e&a^e&t^a&t,n=e=>t(e,2)^t(e,13)^t(e,22),r=e=>t(e,6)^t(e,11)^t(e,25),l=e=>t(e,7)^t(e,18)^e>>>3,s=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],d=8*e.length,c=(960-(8*e.length+1)%512)%512,u=e.length+Math.ceil((c+1)/8)+8,m=new Uint8Array(u);m.set(e),m[e.length]=128;new DataView(m.buffer,m.byteLength-8).setBigUint64(0,BigInt(d),!1);for(let e=0;e>>10)+c[e-7]+l(c[e-15])+c[e-16]>>>0);let[u,h,g,f,y,N,v,b]=s;for(let e=0;e<64;e++){const t=b+r(y)+o(y,N,v)+a[e]+c[e]>>>0,l=n(u)+i(u,h,g)>>>0;b=v,v=N,N=y,y=f+t>>>0,f=g,g=h,h=u,u=t+l>>>0}s[0]=s[0]+u>>>0,s[1]=s[1]+h>>>0,s[2]=s[2]+g>>>0,s[3]=s[3]+f>>>0,s[4]=s[4]+y>>>0,s[5]=s[5]+N>>>0,s[6]=s[6]+v>>>0,s[7]=s[7]+b>>>0}var p;const h=new ArrayBuffer(32),g=new DataView(h);return s.forEach(((e,a)=>{g.setUint32(4*a,e,!1)})),h}const v={_chars:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",encode(e){if("string"!=typeof e)throw new Error("Input must be a string");let a="",t=0;const o=this._stringToUtf8Bytes(e),i=o.length;for(;t>2,s=(3&e)<<4|n>>4,d=(15&n)<<2|r>>6,c=63&r;a+=this._chars.charAt(l),a+=this._chars.charAt(s),a+=t-2>=i?"=":this._chars.charAt(d),a+=t-1>=i?"=":this._chars.charAt(c)}return a},decode(e){if("string"!=typeof e)throw new Error("Input must be a string");for(e=e.replace(/[^A-Za-z0-9+/]/g,"");e.length%4!=0;)e+="=";const a=[];let t=0;const o=e.length;for(;t>4,s=(15&i)<<4|n>>2,d=(3&n)<<6|r;a.push(l),-1!==n&&a.push(s),-1!==r&&a.push(d)}return this._utf8BytesToString(a)},_stringToUtf8Bytes(e){const a=[];for(let t=0;t>6),a.push(128|63&o);else if(55296==(64512&o)&&t+1>18),a.push(128|e>>12&63),a.push(128|e>>6&63),a.push(128|63&e)}else a.push(239,191,189),t--}else a.push(224|o>>12),a.push(128|o>>6&63),a.push(128|63&o)}return a},_utf8BytesToString(e){let a="",t=0;for(;t65535){const t=e-65536;a+=String.fromCharCode(55296|t>>10),a+=String.fromCharCode(56320|1023&t)}else a+=String.fromCharCode(e)}else a+="�"}else a+="�"}return a},encodeURL(e){return this.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")},decodeURL(e){for(e=e.replace(/-/g,"+").replace(/_/g,"/");e.length%4;)e+="=";return this.decode(e)}},b=e=>{const a=(e,a)=>{const t=(65535&e)+(65535&a);return(e>>16)+(a>>16)+(t>>16)<<16|65535&t},t=(e,t,o,i,n,r)=>{return a((l=a(a(t,e),a(i,r)))<<(s=n)|l>>>32-s,o);var l,s},o=(e,a,o,i,n,r,l)=>t(a&o|~a&i,e,a,n,r,l),i=(e,a,o,i,n,r,l)=>t(a&i|o&~i,e,a,n,r,l),n=(e,a,o,i,n,r,l)=>t(a^o^i,e,a,n,r,l),r=(e,a,o,i,n,r,l)=>t(o^(a|~i),e,a,n,r,l),l=e.length,s=1+(l+8>>6),d=new Array(16*s).fill(0);for(let a=0;a>2]|=e[a]<>2]|=128<{let a="";for(let t=0;t<4;t++)a+=("0"+(e>>8*t&255).toString(16)).slice(-2);return a})).join("")};class k{constructor(e){this.queue=[],this.runningTasks=0,this.totalTasks=0,this.completedTasks=0,this.hasFailedTasks=!1,this.downloadedSize=0,this.maxConcurrency=e}addTask(e){return m(this,void 0,void 0,(function*(){return this.totalTasks++,new Promise(((a,t)=>{if(this.hasFailedTasks)return void a(void 0);const o=()=>m(this,void 0,void 0,(function*(){if(this.hasFailedTasks)return this.completedTasks++,void a(void 0);try{this.runningTasks++;const t=yield e();return this.completedTasks++,a(t),t}catch(e){throw this.completedTasks++,t(e),e}finally{this.runningTasks--,this.runNext()}}));this.runningTasks0;){const e=this.queue.shift();e&&e()}else if(this.queue.length>0&&this.runningTasks"application/json"===e?"json":e.startsWith("image/")?e.split("/")[1]:"application/zip"===e?"zip":"application/epub+zip"===e?"epub":"text/plain"===e?"txt":"application/pdf"===e?"pdf":"application/x-mobipocket-ebook"===e?"mobi":"application/vnd.amazon.ebook"===e?"azw3":"application/x-cbz"===e?"cbz":"application/x-cbr"===e?"cbr":"application/x-cbt"===e?"cbt":"application/x-cb7"===e?"cb7":"application/x-fictionbook+xml"===e?"fb2":"text/html"===e?"html":"text/css"===e?"css":"application/javascript"===e?"js":"application/xml"===e?"xml":"application/xhtml+xml"===e?"xhtml":"application/oebps-package+xml"===e?"opf":"application/x-dtbncx+xml"===e?"ncx":"audio/mpeg"===e?"mp3":"audio/wav"===e?"wav":"audio/ogg"===e?"ogg":"video/mp4"===e?"mp4":"video/webm"===e?"webm":"video/x-msvideo"===e?"avi":"video/x-ms-wmv"===e?"wmv":"video/x-flv"===e?"flv":"application/x-mpegURL"===e?"m3u8":"video/MP2T"===e?"ts":"video/3gpp"===e?"3gp":"video/3gpp2"===e?"3g2":"application/x-sqlite3"===e?"db":"",databaseList:h,configList:["themeColors","readingTime","appVersion","cloudSyncTime","lastSyncTime","recentBooks","koreaderBooks","recentAdd","deletedBooks","favoriteBooks","shelfList","txtParsers","aiModelConfig","readingStats","noteTags","recordLocation","thirdpartyToken","sortedShelfList","kindleDeviceList","thirdpartyToken","opdsCatalogs","opdsCatalogList"],copyArrayBuffer:e=>{var a=new ArrayBuffer(e.byteLength);return new Uint8Array(a).set(new Uint8Array(e)),a},base64ToArrayBuffer:g,arrayBufferToBase64:f,generateSHA256Hash:y,simpleEncrypt:function(e,a){if(!e||!a)return"";const t=N((new TextEncoder).encode(a)),o=Array.from(new Uint8Array(t)),i=(new TextEncoder).encode(e),n=new Uint8Array(i.length);for(let e=0;e{const a=new Set(["anthropic","zhipu","doubao","moonshot","deepseek","minimax","minimaxi"]),t=new Set(["qwen","hunyuan","siliconflow","siliconflowglobal","infini"]),o=new Set(["sensenova","openai"]),i=new Set(["ollama"]);return e&&"custom"!==e?a.has(e)?{thinking:{type:"disabled"}}:t.has(e)?{enable_thinking:!1}:o.has(e)?{reasoning_effort:"none"}:i.has(e)?{think:!1}:{}:{}},EmailProviders:["gmail.com","qq.com","163.com","yahoo.com","sina.com","sina.cn","126.com","outlook.com","yeah.net","foxmail.com","hotmail.com","protonmail.com","proton.me","icloud.com","mail.com","live.com","live.cn","msn.cn","msn.com","aliyun.com","sohu.com","yandex.com","naver.com","mail.ru","yahoo.co.jp","139.com","189.com","yandex.ru","189.cn"],Base64:v};const E={cloudUrl:"https://cloud.koodoreader.com",cloudCNUrl:"https://cloud.koodoreader.cn",testUrl:"https://cloudtestv2.960960.xyz",devUrl:"http://192.168.28.159:8000"},C={callbackUrl:"https://web.koodoreader.com/",cnCallbackUrl:"https://web.koodoreader.cn/",dropboxClientId:"vnc67byrssocvy1",yandexClientId:"e5305b62f53844b1994f77a840fd0a37",pcloudClientId:"pg8ten0B3vH",boxClientId:"ltimecqanmpxoaicn9qw3es6l3sdl1ya",duboxClientId:"kc0Ls6xLZugGgLLVhZ8yhUU1cRkRoKNU",yiyiwuClientId:"100197197",microsoftClientId:"506df58a-29ab-4020-afc5-6f423dc80f35",googleClientId:"1051055003225-ph1f5fvh328dhv7bco5jitlnfhg6ks2t.apps.googleusercontent.com",appleClientId:"com.koodoreader.auth",facebookClientId:"2845583825559500",githubClientId:"Ov23liJVzfvJMMEEZ8v2",adriveClientId:"a128ae7b9c094545af623de61dc0a1ef"},T={google:{clientId:C.googleClientId,scopes:["openid email profile"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"openid email profile"}},microsoft:{clientId:C.microsoftClientId,scopes:["openid","profile","User.Read","offline_access"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"openid profile User.Read offline_access"}},facebook:{clientId:C.facebookClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:""}},github:{clientId:C.githubClientId,scopes:["user:email"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"user:email"}},apple:{clientId:C.appleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{}},email:{clientId:"",scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:""}}},w=["backgroundColor","textColor","fontSize","margin","letterSpacing","paraSpacing","scale","brightness","fontFamily","subFontFamily","lineHeight","textAlign","textOrientation","convertChinese","selectAction","fullTranslationMode","readerMode","pdfReaderMode","isBold","isIndent","isSliding","isUnderline","isShadow","isItalic","isInvert","isBionic","isHyphenation","isOrphanWidow","isKeepPDFBackground","isAllowScript","isStartFromEven"];var A={CloudMode:"production",CloudConfig:E,ConvertLangMap:{en:"English",zhCN:"Chinese",zhTW:"Chinese",zhMO:"Chinese",tr:"Turkish",ar:"Arabic",ro:"Romanian",pl:"Polish",cs:"Czech",ja:"Japanese",ta:"Tamil",uk:"Ukrainian",sl:"Slovenian",bo:"Tibetan",id:"Indonesian",hy:"Armenian",el:"Greek",hu:"Hungarian",hi:"Hindi",bg:"Bulgarian",nl:"Dutch",it:"Italian",bn:"Bengali",tl:"Tagalog",sv:"Swedish",ga:"Irish",ko:"Korean",de:"German",ru:"Russian",es:"Spanish",fr:"French",fa:"Persian",ptBR:"Portuguese",th:"Thai",sr:"Serbian",am:"Amharic",da:"Danish",fi:"Finnish",ie:"Interlingue",pt:"Portuguese",vi:"Vietnamese"},ContentRegxConfig:[{label:"Default parser",value:"Default parser",subtitle:"Suitable for most txt files",regex:""},{label:"Chinese novel parser",value:"Chinese novel parser",subtitle:"Suitable for most Chinese novels, eg. 第一章,第2回",regex:"^\\s*(第[0-9一二三四五六七八九十百千万零壹贰叁肆伍陆柒捌玖拾佰仟]+[章回])\\s*"},{label:"English novel parser",value:"English novel parser",subtitle:"Suitable for most English novels, eg. Chapter 1, Part II",regex:"^\\s*(Chapter|Part|Book|CHAPTER|PART|BOOK)\\s*"},{label:"Number parser",value:"Number parser",subtitle:"Suitable for novels with number chapter titles, eg. 1, 2, 3",regex:"^\\s*([0-9]+[\\s.、::·\\-—]+|[一二三四五六七八九十百千万零]+[\\s.、::·\\-—]+).+"}],StyleKeys:w,ThirdpartyConfig:C,LoginAuthRequest:T,LoginDiscovery:{microsoft:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"},facebook:{authorizationEndpoint:"https://www.facebook.com/v12.0/dialog/oauth",tokenEndpoint:"https://graph.facebook.com/v12.0/oauth/access_token"},github:{authorizationEndpoint:"https://github.com/login/oauth/authorize",tokenEndpoint:"https://github.com/login/oauth/access_token"},apple:{authorizationEndpoint:"https://appleid.apple.com/auth/authorize",tokenEndpoint:"https://appleid.apple.com/auth/token"},email:{authorizationEndpoint:"",tokenEndpoint:""}},DriveAuthRequest:{dropbox:{clientId:C.dropboxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{token_access_type:"offline"}},yandex:{clientId:C.yandexClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code",force_confirm:"true"}},boxnet:{clientId:C.boxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}},pcloud:{clientId:C.pcloudClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code"}},dubox:{clientId:C.duboxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code",scope:"basic,netdisk",device_id:"119827642",qrcode:"1"}},yiyiwu:{clientId:C.yiyiwuClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code"}},adrive:{clientId:C.adriveClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}},microsoft:{clientId:C.microsoftClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"files.readwrite.appfolder offline_access"}},google:{clientId:C.googleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"https://www.googleapis.com/auth/drive.file",access_type:"offline"}},microsoft_exp:{clientId:C.microsoftClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"files.readwrite.all offline_access"}},google_exp:{clientId:C.googleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"https://www.googleapis.com/auth/drive",access_type:"offline"}}},DriveDiscovery:{dropbox:{authorizationEndpoint:"https://www.dropbox.com/oauth2/authorize",tokenEndpoint:"https://www.dropbox.com/oauth2/token"},yandex:{authorizationEndpoint:"https://oauth.yandex.com/authorize",tokenEndpoint:"https://oauth.yandex.com/token"},boxnet:{authorizationEndpoint:"https://account.box.com/api/oauth2/authorize",tokenEndpoint:"https://api.box.com/oauth2/token"},pcloud:{authorizationEndpoint:"https://my.pcloud.com/oauth2/authorize",tokenEndpoint:"https://api.pcloud.com/oauth2_token"},dubox:{authorizationEndpoint:"https://openapi.baidu.com/oauth/2.0/authorize",tokenEndpoint:"https://openapi.baidu.com/oauth/2.0/token"},yiyiwu:{authorizationEndpoint:"https://passportapi.115.com/open/authorize",tokenEndpoint:"https://passportapi.115.com/open/authorize"},adrive:{authorizationEndpoint:"https://openapi.alipan.com/oauth/authorize",tokenEndpoint:"https://openapi.alipan.com/oauth/token"},microsoft:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"},microsoft_exp:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google_exp:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"}},AiProviderList:[{id:"custom",name:"Custom model",defaultEndpoint:"",modelsEndpoint:"",isCNAvailable:!0},{id:"openai",name:"OpenAI",defaultEndpoint:"https://api.openai.com/v1",modelsEndpoint:"https://api.openai.com/v1/models"},{id:"anthropic",name:"Anthropic",defaultEndpoint:"https://api.anthropic.com/v1",modelsEndpoint:"https://api.anthropic.com/v1/models"},{id:"google",name:"Google Gemini",defaultEndpoint:"https://generativelanguage.googleapis.com/v1beta/openai",modelsEndpoint:"https://generativelanguage.googleapis.com/v1beta/openai/models"},{id:"deepseek",name:"DeepSeek",defaultEndpoint:"https://api.deepseek.com/v1",modelsEndpoint:"https://api.deepseek.com/v1/models",isCNAvailable:!0},{id:"mistral",name:"Mistral AI",defaultEndpoint:"https://api.mistral.ai/v1",modelsEndpoint:"https://api.mistral.ai/v1/models"},{id:"cohere",name:"Cohere",defaultEndpoint:"https://api.cohere.ai/compatibility/v1",modelsEndpoint:"https://api.cohere.ai/compatibility/v1/models"},{id:"groq",name:"Groq",defaultEndpoint:"https://api.groq.com/openai/v1",modelsEndpoint:"https://api.groq.com/openai/v1/models"},{id:"together",name:"Together AI",defaultEndpoint:"https://api.together.xyz/v1",modelsEndpoint:"https://api.together.xyz/v1/models"},{id:"fireworks",name:"Fireworks AI",defaultEndpoint:"https://api.fireworks.ai/inference/v1",modelsEndpoint:"https://api.fireworks.ai/inference/v1/models"},{id:"perplexity",name:"Perplexity",defaultEndpoint:"https://api.perplexity.ai",modelsEndpoint:"https://api.perplexity.ai/v1/models"},{id:"openrouter",name:"OpenRouter",defaultEndpoint:"https://openrouter.ai/api/v1",modelsEndpoint:"https://openrouter.ai/api/v1/models"},{id:"ai21",name:"AI21 Labs",defaultEndpoint:"https://api.ai21.com/studio/v1",modelsEndpoint:"https://api.ai21.com/studio/v1/models"},{id:"xai",name:"xAI (Grok)",defaultEndpoint:"https://api.x.ai/v1",modelsEndpoint:"https://api.x.ai/v1/models"},{id:"sambanova",name:"SambaNova",defaultEndpoint:"https://api.sambanova.ai/v1",modelsEndpoint:"https://api.sambanova.ai/v1/models"},{id:"cerebras",name:"Cerebras",defaultEndpoint:"https://api.cerebras.ai/v1",modelsEndpoint:"https://api.cerebras.ai/v1/models"},{id:"hyperbolic",name:"Hyperbolic",defaultEndpoint:"https://api.hyperbolic.xyz/v1",modelsEndpoint:"https://api.hyperbolic.xyz/v1/models"},{id:"novita",name:"Novita AI",defaultEndpoint:"https://api.novita.ai/openai",modelsEndpoint:"https://api.novita.ai/openai/models"},{id:"lepton",name:"Lepton AI",defaultEndpoint:"https://llm.lepton.run/api/v1",modelsEndpoint:"https://llm.lepton.run/api/v1/models"},{id:"deepinfra",name:"DeepInfra",defaultEndpoint:"https://api.deepinfra.com/v1/openai",modelsEndpoint:"https://api.deepinfra.com/v1/openai/models"},{id:"replicate",name:"Replicate",defaultEndpoint:"https://api.replicate.com/v1",modelsEndpoint:"https://api.replicate.com/v1/models"},{id:"zhipu",name:"Zhipu AI (智谱)",defaultEndpoint:"https://open.bigmodel.cn/api/paas/v4",modelsEndpoint:"https://open.bigmodel.cn/api/paas/v4/models",isCNAvailable:!0},{id:"qwen",name:"Alibaba Qwen (通义千问)",defaultEndpoint:"https://dashscope.aliyuncs.com/compatible-mode/v1",modelsEndpoint:"https://dashscope.aliyuncs.com/compatible-mode/v1/models",isCNAvailable:!0},{id:"moonshot",name:"Moonshot (月之暗面)",defaultEndpoint:"https://api.moonshot.cn/v1",modelsEndpoint:"https://api.moonshot.cn/v1/models",isCNAvailable:!0},{id:"baidu",name:"Baidu ERNIE (文心一言)",defaultEndpoint:"https://qianfan.baidubce.com/v2",modelsEndpoint:"https://qianfan.baidubce.com/v2/models",isCNAvailable:!0},{id:"doubao",name:"Volcengine Doubao (豆包)",defaultEndpoint:"https://ark.cn-beijing.volces.com/api/v3",modelsEndpoint:"https://ark.cn-beijing.volces.com/api/v3/models",isCNAvailable:!0},{id:"spark",name:"iFlytek Spark (讯飞星火)",defaultEndpoint:"https://spark-api-open.xf-yun.com/v1",modelsEndpoint:"https://spark-api-open.xf-yun.com/v1/models",isCNAvailable:!0},{id:"hunyuan",name:"Tencent Hunyuan (腾讯混元)",defaultEndpoint:"https://api.hunyuan.cloud.tencent.com/v1",modelsEndpoint:"https://api.hunyuan.cloud.tencent.com/v1/models",isCNAvailable:!0},{id:"minimaxi",name:"MiniMax (国内版)",defaultEndpoint:"https://api.minimaxi.com/v1",modelsEndpoint:"https://api.minimaxi.com/v1/models",isCNAvailable:!0},{id:"minimax",name:"MiniMax (国际版)",defaultEndpoint:"https://api.minimax.io/v1",modelsEndpoint:"https://api.minimax.io/v1/models"},{id:"baichuan",name:"Baichuan (百川)",defaultEndpoint:"https://api.baichuan-ai.com/v1",modelsEndpoint:"https://api.baichuan-ai.com/v1/models",isCNAvailable:!0},{id:"stepfun",name:"StepFun (阶跃星辰)",defaultEndpoint:"https://api.stepfun.com/v1",modelsEndpoint:"https://api.stepfun.com/v1/models",isCNAvailable:!0},{id:"lingyi",name:"Lingyiwanwu (零一万物)",defaultEndpoint:"https://api.lingyiwanwu.com/v1",modelsEndpoint:"https://api.lingyiwanwu.com/v1/models",isCNAvailable:!0},{id:"siliconflow",name:"SiliconFlow (硅基流动)",defaultEndpoint:"https://api.siliconflow.cn/v1",modelsEndpoint:"https://api.siliconflow.cn/v1/models",isCNAvailable:!0},{id:"siliconflowglobal",name:"SiliconFlow (国际版)",defaultEndpoint:"https://api.siliconflow.com/v1",modelsEndpoint:"https://api.siliconflow.com/v1/models"},{id:"sensenova",name:"SenseNova (日日新)",defaultEndpoint:"https://token.sensenova.cn/v1",modelsEndpoint:"https://token.sensenova.cn/v1/models",isCNAvailable:!0},{id:"infini",name:"Infini AI (无问芯穹)",defaultEndpoint:"https://cloud.infini-ai.com/maas/v1",modelsEndpoint:"https://cloud.infini-ai.com/maas/v1/models",isCNAvailable:!0},{id:"ollama",name:"Ollama (Local)",defaultEndpoint:"http://localhost:11434/v1",modelsEndpoint:"http://localhost:11434/v1/models",isCNAvailable:!0},{id:"lmstudio",name:"LM Studio (Local)",defaultEndpoint:"http://localhost:1234/v1",modelsEndpoint:"http://localhost:1234/v1/models",isCNAvailable:!0},{id:"vllm",name:"vLLM (Local)",defaultEndpoint:"http://localhost:8000/v1",modelsEndpoint:"http://localhost:8000/v1/models",isCNAvailable:!0},{id:"azure",name:"Azure OpenAI",defaultEndpoint:"",modelsEndpoint:""},{id:"aws_bedrock",name:"AWS Bedrock",defaultEndpoint:"",modelsEndpoint:""}],DefaultPrompts:{aiTranslate:"You are a professional translator. Translate the following text from {from} to {to}. Only return the translated text, no explanations.\n\nText: {text}",aiDict:"You are a professional dictionary assistant. Analyze the word or phrase: {word}\nProvide a comprehensive explanation including pronunciation, definitions, example sentences, and usage notes using {to} as the target language. ",aiAssistance:"You are a helpful reading assistant. The user is reading a book. Here is the context:\n{text}\n\nAnswer the user's question concisely and helpfully, and reply with the same language."},SpeechList:[{label:"English",code:"en",example:"To be, or not to be, that is the question."},{label:"Simplified Chinese",code:"zh",example:"千里之行,始于足下。"},{label:"Japanese",code:"ja",example:"猿も木から落ちる。"},{label:"Korean",code:"ko",example:"가는 날이 장날이다."},{label:"French",code:"fr",example:"Liberté, égalité, fraternité."},{label:"German",code:"de",example:"Der Weg ist das Ziel."},{label:"Spanish",code:"es",example:"La vida es un sueño."},{label:"Italian",code:"it",example:"Dolce far niente."},{label:"Russian",code:"ru",example:"Век живи, век учись."},{label:"Portuguese",code:"pt",example:"Saudade é um sentimento profundo."},{label:"Hindi",code:"hi",example:"सपने वो नहीं जो हम सोते वक्त देखते हैं।"},{label:"Afrikaans",code:"af",example:"Die lewe is 'n geskenk."},{label:"Amharic",code:"am",example:"ዕውቀት ብርሃን ነው።"},{label:"Arabic",code:"ar",example:"العلم نور والجهل ظلام."},{label:"Azerbaijani",code:"az",example:"Elm işıqdır, cəhalət zülmət."},{label:"Bulgarian",code:"bg",example:"Знанието е сила."},{label:"Bengali",code:"bn",example:"জ্ঞানই শক্তি।"},{label:"Bosnian",code:"bs",example:"Znanje je moć."},{label:"Catalan",code:"ca",example:"El saber no ocupa lloc."},{label:"Czech",code:"cs",example:"Bez práce nejsou koláče."},{label:"Welsh",code:"cy",example:"Nid aur popeth melyn."},{label:"Danish",code:"da",example:"Lykken er ikke et sted, men en retning."},{label:"Greek",code:"el",example:"Η γνώση είναι δύναμη."},{label:"Estonian",code:"et",example:"Teadmine on jõud."},{label:"Basque",code:"eu",example:"Jakitea boterea da."},{label:"Persian",code:"fa",example:"دانش قدرت است."},{label:"Finnish",code:"fi",example:"Tieto on valtaa."},{label:"Filipino",code:"fil",example:"Ang kaalaman ay kapangyarihan."},{label:"Irish",code:"ga",example:"Is fearr Gaeilge briste ná Béarla cliste."},{label:"Galician",code:"gl",example:"O saber non ocupa lugar."},{label:"Gujarati",code:"gu",example:"જ્ઞાન શક્તિ છે."},{label:"Hebrew",code:"he",example:"ידע הוא כוח."},{label:"Croatian",code:"hr",example:"Znanje je moć."},{label:"Hungarian",code:"hu",example:"A tudás hatalom."},{label:"Armenian",code:"hy",example:"Գիտելիքը ուժ է."},{label:"Indonesian",code:"id",example:"Pengetahuan adalah kekuatan."},{label:"Icelandic",code:"is",example:"Þekking er máttur."},{label:"Inuktitut",code:"iu",example:"ᐃᓕᓐᓂᐊᕐᓂᖅ ᐱᒻᒪᕆᐅᕗᖅ."},{label:"Javanese",code:"jv",example:"Ilmu iku kelakone kanthi laku."},{label:"Georgian",code:"ka",example:"ცოდნა ძალაა."},{label:"Kazakh",code:"kk",example:"Білім — күш."},{label:"Khmer",code:"km",example:"ចំណេះដឹងគឺជាអំណាច។"},{label:"Kannada",code:"kn",example:"ಜ್ಞಾನವೇ ಶಕ್ತಿ."},{label:"Lao",code:"lo",example:"ຄວາມຮູ້ຄືພະລັງ."},{label:"Lithuanian",code:"lt",example:"Žinios yra jėga."},{label:"Latvian",code:"lv",example:"Zināšanas ir spēks."},{label:"Macedonian",code:"mk",example:"Знаењето е моќ."},{label:"Malayalam",code:"ml",example:"അറിവ് ശക്തിയാണ്."},{label:"Mongolian",code:"mn",example:"Мэдлэг бол хүч."},{label:"Marathi",code:"mr",example:"ज्ञान हीच शक्ती आहे."},{label:"Malay",code:"ms",example:"Ilmu itu cahaya."},{label:"Maltese",code:"mt",example:"L-għarfien huwa l-poter."},{label:"Burmese",code:"my",example:"ဗဟုသုတသည် အားဖြစ်သည်။"},{label:"Norwegian",code:"nb",example:"Kunnskap er makt."},{label:"Nepali",code:"ne",example:"ज्ञान नै शक्ति हो।"},{label:"Dutch",code:"nl",example:"Kennis is macht."},{label:"Odia",code:"or",example:"ଜ୍ଞାନ ହିଁ ଶକ୍ତି।"},{label:"Punjabi",code:"pa",example:"ਗਿਆਨ ਹੀ ਸ਼ਕਤੀ ਹੈ।"},{label:"Polish",code:"pl",example:"Wiedza to potęga."},{label:"Pashto",code:"ps",example:"د پوهې ډیوه روښانه ده."},{label:"Romanian",code:"ro",example:"Cartea este o comoară."},{label:"Sinhala",code:"si",example:"දැනුම බලයකි."},{label:"Slovak",code:"sk",example:"Vedomosti sú sila."},{label:"Slovenian",code:"sl",example:"Znanje je moč."},{label:"Somali",code:"so",example:"Aqoontu waa iftiin."},{label:"Albanian",code:"sq",example:"Dija është fuqi."},{label:"Serbian",code:"sr",example:"Знање је моћ."},{label:"Sundanese",code:"su",example:"Élmu éta cahaya."},{label:"Swedish",code:"sv",example:"Kunskap är makt."},{label:"Swahili",code:"sw",example:"Maarifa ni nguvu."},{label:"Tamil",code:"ta",example:"அறிவே ஆற்றல்."},{label:"Telugu",code:"te",example:"జ్ఞానమే శక్తి."},{label:"Thai",code:"th",example:"ความรู้คือพลัง."},{label:"Turkish",code:"tr",example:"Bilgi güçtür."},{label:"Ukrainian",code:"uk",example:"Знання — сила."},{label:"Urdu",code:"ur",example:"علم ہی طاقت ہے۔"},{label:"Uzbek",code:"uz",example:"Bilim – kuch."},{label:"Vietnamese",code:"vi",example:"Học vấn là sức mạnh."},{label:"Wu Chinese",code:"wuu",example:"学问是力量。"},{label:"Cantonese",code:"yue",example:"知識就係力量。"},{label:"Zulu",code:"zu",example:"Ulwazi lungamandla."}],HighlightStyleTypes:[{value:"background",label:"Highlight background"},{value:"underline",label:"Underline"},{value:"strikethrough",label:"Strikethrough"},{value:"wavy",label:"Wavy underline"}],HighlightPresetColors:{background:["#F3C9C9","#FEF3CD","#CEFACD","#CDE9FA"],underline:["#FF0000","#60A5FA","#FF9900","#2EFF2E"],strikethrough:["#FF0000","#60A5FA","#FF9900","#2EFF2E"],wavy:["#FF0000","#60A5FA","#FF9900","#2EFF2E"]},PresetThemeList:[{key:"yellow",textColor:"rgba(89, 68, 41,1)",backgroundColor:"rgba(233, 216, 188,1)",title:"羊皮"},{key:"green",textColor:"rgba(54, 80, 62,1)",backgroundColor:"rgba(197, 231, 207,1)",title:"护眼"},{key:"light",textColor:"rgba(0,0,0,1)",backgroundColor:"rgba(255,255,255,1)",title:"白天"},{key:"night",textColor:"rgba(255,255,255,1)",backgroundColor:"rgba(44,47,49,1)",title:"黑夜"},{key:"sepia",textColor:"rgba(93, 64, 55,1)",backgroundColor:"rgba(245, 235, 220,1)",title:"古卷"},{key:"blue",textColor:"rgba(28, 52, 84,1)",backgroundColor:"rgba(230, 240, 250,1)",title:"晨雾"},{key:"purple",textColor:"rgba(68, 42, 84,1)",backgroundColor:"rgba(240, 230, 250,1)",title:"紫萝"},{key:"pink",textColor:"rgba(84, 42, 68,1)",backgroundColor:"rgba(250, 235, 245,1)",title:"樱花"},{key:"brown",textColor:"rgba(74, 54, 42,1)",backgroundColor:"rgba(240, 230, 215,1)",title:"木纹"},{key:"gray",textColor:"rgba(64, 64, 64,1)",backgroundColor:"rgba(240, 240, 240,1)",title:"素雅"},{key:"darkgreen",textColor:"rgba(200, 220, 200,1)",backgroundColor:"rgba(25, 35, 30,1)",title:"深林"},{key:"darkblue",textColor:"rgba(200, 210, 230,1)",backgroundColor:"rgba(20, 30, 45,1)",title:"深海"},{key:"coral",textColor:"rgba(84, 50, 42,1)",backgroundColor:"rgba(255, 235, 230,1)",title:"珊瑚"},{key:"mint",textColor:"rgba(42, 74, 64,1)",backgroundColor:"rgba(230, 250, 245,1)",title:"薄荷"},{key:"lavender",textColor:"rgba(54, 42, 74,1)",backgroundColor:"rgba(245, 240, 255,1)",title:"薰衣"},{key:"cream",textColor:"rgba(74, 64, 42,1)",backgroundColor:"rgba(255, 250, 240,1)",title:"奶油"},{key:"darkbrown",textColor:"rgba(230, 215, 200,1)",backgroundColor:"rgba(35, 25, 20,1)",title:"深棕"},{key:"olive",textColor:"rgba(64, 74, 42,1)",backgroundColor:"rgba(240, 245, 230,1)",title:"橄榄"},{key:"rose",textColor:"rgba(84, 42, 54,1)",backgroundColor:"rgba(255, 240, 245,1)",title:"玫瑰"},{key:"slate",textColor:"rgba(54, 64, 74,1)",backgroundColor:"rgba(235, 240, 245,1)",title:"石板"}],OfficialVoiceList:[{name:"af_alloy",gender:"female",displayName:"Alloy",locale:"en-US",language:"English (US)"},{name:"af_aoede",gender:"female",displayName:"Aoede",locale:"en-US",language:"English (US)"},{name:"af_bella",gender:"female",displayName:"Bella",locale:"en-US",language:"English (US)"},{name:"af_heart",gender:"female",displayName:"Heart",locale:"en-US",language:"English (US)"},{name:"af_jessica",gender:"female",displayName:"Jessica",locale:"en-US",language:"English (US)"},{name:"af_kore",gender:"female",displayName:"Kore",locale:"en-US",language:"English (US)"},{name:"af_nicole",gender:"female",displayName:"Nicole",locale:"en-US",language:"English (US)"},{name:"af_nova",gender:"female",displayName:"Nova",locale:"en-US",language:"English (US)"},{name:"af_river",gender:"female",displayName:"River",locale:"en-US",language:"English (US)"},{name:"af_sarah",gender:"female",displayName:"Sarah",locale:"en-US",language:"English (US)"},{name:"af_sky",gender:"female",displayName:"Sky",locale:"en-US",language:"English (US)"},{name:"am_adam",gender:"male",displayName:"Adam",locale:"en-US",language:"English (US)"},{name:"am_echo",gender:"male",displayName:"Echo",locale:"en-US",language:"English (US)"},{name:"am_eric",gender:"male",displayName:"Eric",locale:"en-US",language:"English (US)"},{name:"am_fenrir",gender:"male",displayName:"Fenrir",locale:"en-US",language:"English (US)"},{name:"am_liam",gender:"male",displayName:"Liam",locale:"en-US",language:"English (US)"},{name:"am_michael",gender:"male",displayName:"Michael",locale:"en-US",language:"English (US)"},{name:"am_onyx",gender:"male",displayName:"Onyx",locale:"en-US",language:"English (US)"},{name:"am_puck",gender:"male",displayName:"Puck",locale:"en-US",language:"English (US)"},{name:"am_santa",gender:"male",displayName:"Santa",locale:"en-US",language:"English (US)"},{name:"bf_alice",gender:"female",displayName:"Alice",locale:"en-GB",language:"English (UK)"},{name:"bf_emma",gender:"female",displayName:"Emma",locale:"en-GB",language:"English (UK)"},{name:"bf_isabella",gender:"female",displayName:"Isabella",locale:"en-GB",language:"English (UK)"},{name:"bf_lily",gender:"female",displayName:"Lily",locale:"en-GB",language:"English (UK)"},{name:"bm_daniel",gender:"male",displayName:"Daniel",locale:"en-GB",language:"English (UK)"},{name:"bm_fable",gender:"male",displayName:"Fable",locale:"en-GB",language:"English (UK)"},{name:"bm_george",gender:"male",displayName:"George",locale:"en-GB",language:"English (UK)"},{name:"bm_lewis",gender:"male",displayName:"Lewis",locale:"en-GB",language:"English (UK)"},{name:"ef_dora",gender:"female",displayName:"Dora",locale:"es-ES",language:"Español"},{name:"em_alex",gender:"male",displayName:"Alex",locale:"es-ES",language:"Español"},{name:"em_santa",gender:"male",displayName:"Santa",locale:"es-ES",language:"Español"},{name:"ff_siwis",gender:"female",displayName:"Siwis",locale:"fr-FR",language:"Français"},{name:"hf_alpha",gender:"female",displayName:"Alpha",locale:"hi-IN",language:"हिन्दी"},{name:"hf_beta",gender:"female",displayName:"Beta",locale:"hi-IN",language:"हिन्दी"},{name:"hm_omega",gender:"male",displayName:"Omega",locale:"hi-IN",language:"हिन्दी"},{name:"hm_psi",gender:"male",displayName:"Psi",locale:"hi-IN",language:"हिन्दी"},{name:"if_sara",gender:"female",displayName:"Sara",locale:"it-IT",language:"Italiano"},{name:"im_nicola",gender:"male",displayName:"Nicola",locale:"it-IT",language:"Italiano"},{name:"jf_alpha",gender:"female",displayName:"Alpha",locale:"ja-JP",language:"日本語"},{name:"jf_gongitsune",gender:"female",displayName:"Gongitsune",locale:"ja-JP",language:"日本語"},{name:"jf_nezumi",gender:"female",displayName:"Nezumi",locale:"ja-JP",language:"日本語"},{name:"jf_tebukuro",gender:"female",displayName:"Tebukuro",locale:"ja-JP",language:"日本語"},{name:"jm_kumo",gender:"male",displayName:"Kumo",locale:"ja-JP",language:"日本語"},{name:"pf_dora",gender:"female",displayName:"Dora",locale:"pt-BR",language:"Português (Brasil)"},{name:"pm_alex",gender:"male",displayName:"Alex",locale:"pt-BR",language:"Português (Brasil)"},{name:"pm_santa",gender:"male",displayName:"Santa",locale:"pt-BR",language:"Português (Brasil)"},{name:"zf_xiaoxiao",gender:"female",displayName:"Xiaoxiao",locale:"zh-CN",language:"中文"},{name:"zm_yunxi",gender:"male",displayName:"Yunxi",locale:"zh-CN",language:"中文"},{name:"zf_xiaoyi",gender:"female",displayName:"Xiaoyi",locale:"zh-CN",language:"中文"},{name:"zm_yunyang",gender:"male",displayName:"Yunyang",locale:"zh-CN",language:"中文"},{name:"zm_yunxia",gender:"male",displayName:"Yunxia",locale:"zh-CN",language:"中文"},{name:"zm_yunjian",gender:"male",displayName:"Yunjian",locale:"zh-CN",language:"中文"},{name:"zf_xiaoni",gender:"female",displayName:"Xiaoni 陕西",locale:"zh-CN",language:"中文"},{name:"zf_xiaobei",gender:"female",displayName:"Xiaobei 辽宁",locale:"zh-CN",language:"中文"}],AzureTTSVoiceList:[{name:"de-DE-AmalaNeural",gender:"female",displayName:"Amala",locale:"de-DE"},{name:"de-DE-BerndNeural",gender:"male",displayName:"Bernd",locale:"de-DE"},{name:"de-DE-ConradNeural",gender:"male",displayName:"Conrad",locale:"de-DE"},{name:"de-DE-KatjaNeural",gender:"female",displayName:"Katja",locale:"de-DE"},{name:"en-GB-LibbyNeural",gender:"female",displayName:"Libby",locale:"en-GB"},{name:"en-GB-RyanNeural",gender:"male",displayName:"Ryan",locale:"en-GB"},{name:"en-GB-SoniaNeural",gender:"female",displayName:"Sonia",locale:"en-GB"},{name:"en-US-AmberNeural",gender:"female",displayName:"Amber",locale:"en-US"},{name:"en-US-AriaNeural",gender:"female",displayName:"Aria",locale:"en-US"},{name:"en-US-ChristopherNeural",gender:"male",displayName:"Christopher",locale:"en-US"},{name:"en-US-DavisNeural",gender:"male",displayName:"Davis",locale:"en-US"},{name:"en-US-EricNeural",gender:"male",displayName:"Eric",locale:"en-US"},{name:"en-US-GuyNeural",gender:"male",displayName:"Guy",locale:"en-US"},{name:"en-US-JaneNeural",gender:"female",displayName:"Jane",locale:"en-US"},{name:"en-US-JennyNeural",gender:"female",displayName:"Jenny",locale:"en-US"},{name:"en-US-MichelleNeural",gender:"female",displayName:"Michelle",locale:"en-US"},{name:"en-US-SaraNeural",gender:"female",displayName:"Sara",locale:"en-US"},{name:"es-ES-AbrilNeural",gender:"female",displayName:"Abril",locale:"es-ES"},{name:"es-ES-AlvaroNeural",gender:"male",displayName:"Álvaro",locale:"es-ES"},{name:"es-ES-ArnauNeural",gender:"male",displayName:"Arnau",locale:"es-ES"},{name:"es-ES-ElviraNeural",gender:"female",displayName:"Elvira",locale:"es-ES"},{name:"fr-FR-DeniseNeural",gender:"female",displayName:"Denise",locale:"fr-FR"},{name:"fr-FR-HenriNeural",gender:"male",displayName:"Henri",locale:"fr-FR"},{name:"it-IT-BenignoNeural",gender:"male",displayName:"Benigno",locale:"it-IT"},{name:"it-IT-DiegoNeural",gender:"male",displayName:"Diego",locale:"it-IT"},{name:"it-IT-ElsaNeural",gender:"female",displayName:"Elsa",locale:"it-IT"},{name:"it-IT-IsabellaNeural",gender:"female",displayName:"Isabella",locale:"it-IT"},{name:"ja-JP-KeitaNeural",gender:"male",displayName:"圭太",locale:"ja-JP"},{name:"ja-JP-NanamiNeural",gender:"female",displayName:"七海",locale:"ja-JP"},{name:"ko-KR-InJoonNeural",gender:"male",displayName:"인준",locale:"ko-KR"},{name:"ko-KR-SoonBokNeural",gender:"female",displayName:"순복",locale:"ko-KR"},{name:"ko-KR-SunHiNeural",gender:"female",displayName:"선히",locale:"ko-KR"},{name:"pt-BR-AntonioNeural",gender:"male",displayName:"Antônio",locale:"pt-BR"},{name:"pt-BR-FranciscaNeural",gender:"female",displayName:"Francisca",locale:"pt-BR"},{name:"pt-PT-DuarteNeural",gender:"male",displayName:"Duarte",locale:"pt-PT"},{name:"pt-PT-RaquelNeural",gender:"female",displayName:"Raquel",locale:"pt-PT"},{name:"ru-RU-DariyaNeural",gender:"female",displayName:"Дария",locale:"ru-RU"},{name:"ru-RU-DmitryNeural",gender:"male",displayName:"Дмитрий",locale:"ru-RU"},{name:"ru-RU-SvetlanaNeural",gender:"female",displayName:"Светлана",locale:"ru-RU"},{name:"yue-CN-XiaoMinNeural",gender:"female",displayName:"晓敏",locale:"yue-CN"},{name:"yue-CN-YunSongNeural",gender:"male",displayName:"云松",locale:"yue-CN"},{name:"zh-CN-XiaoxiaoNeural",gender:"female",displayName:"晓晓",locale:"zh-CN"},{name:"zh-CN-YunxiNeural",gender:"male",displayName:"云希",locale:"zh-CN"},{name:"zh-HK-HiuMaanNeural",gender:"female",displayName:"曉曼",locale:"zh-HK"},{name:"zh-HK-WanLungNeural",gender:"male",displayName:"雲龍",locale:"zh-HK"},{name:"zh-TW-HsiaoChenNeural",gender:"female",displayName:"曉臻",locale:"zh-TW"},{name:"zh-TW-YunJheNeural",gender:"male",displayName:"雲哲",locale:"zh-TW"},{name:"af-ZA-AdriNeural",gender:"female",displayName:"Adri",locale:"af-ZA"},{name:"af-ZA-WillemNeural",gender:"male",displayName:"Willem",locale:"af-ZA"},{name:"sq-AL-AnilaNeural",gender:"female",displayName:"Anila",locale:"sq-AL"},{name:"sq-AL-IlirNeural",gender:"male",displayName:"Ilir",locale:"sq-AL"},{name:"am-ET-AmehaNeural",gender:"male",displayName:"አምሀ",locale:"am-ET"},{name:"am-ET-MekdesNeural",gender:"female",displayName:"መቅደስ",locale:"am-ET"},{name:"ar-DZ-AminaNeural",gender:"female",displayName:"أمينة",locale:"ar-DZ"},{name:"ar-DZ-IsmaelNeural",gender:"male",displayName:"إسماعيل",locale:"ar-DZ"},{name:"ar-BH-AliNeural",gender:"male",displayName:"علي",locale:"ar-BH"},{name:"ar-BH-LailaNeural",gender:"female",displayName:"ليلى",locale:"ar-BH"},{name:"ar-EG-SalmaNeural",gender:"female",displayName:"سلمى",locale:"ar-EG"},{name:"ar-EG-ShakirNeural",gender:"male",displayName:"شاكر",locale:"ar-EG"},{name:"ar-IQ-BasselNeural",gender:"male",displayName:"باسل",locale:"ar-IQ"},{name:"ar-IQ-RanaNeural",gender:"female",displayName:"رنا",locale:"ar-IQ"},{name:"ar-JO-SanaNeural",gender:"female",displayName:"سناء",locale:"ar-JO"},{name:"ar-JO-TaimNeural",gender:"male",displayName:"تيم",locale:"ar-JO"},{name:"ar-KW-FahedNeural",gender:"male",displayName:"فهد",locale:"ar-KW"},{name:"ar-KW-NouraNeural",gender:"female",displayName:"نورا",locale:"ar-KW"},{name:"ar-LB-LaylaNeural",gender:"female",displayName:"ليلى",locale:"ar-LB"},{name:"ar-LB-RamiNeural",gender:"male",displayName:"رامي",locale:"ar-LB"},{name:"ar-LY-ImanNeural",gender:"female",displayName:"إيمان",locale:"ar-LY"},{name:"ar-LY-OmarNeural",gender:"male",displayName:"أحمد",locale:"ar-LY"},{name:"ar-MA-JamalNeural",gender:"male",displayName:"جمال",locale:"ar-MA"},{name:"ar-MA-MounaNeural",gender:"female",displayName:"منى",locale:"ar-MA"},{name:"ar-OM-AbdullahNeural",gender:"male",displayName:"عبدالله",locale:"ar-OM"},{name:"ar-OM-AyshaNeural",gender:"female",displayName:"عائشة",locale:"ar-OM"},{name:"ar-QA-AmalNeural",gender:"female",displayName:"أمل",locale:"ar-QA"},{name:"ar-QA-MoazNeural",gender:"male",displayName:"معاذ",locale:"ar-QA"},{name:"ar-SA-HamedNeural",gender:"male",displayName:"حامد",locale:"ar-SA"},{name:"ar-SA-ZariyahNeural",gender:"female",displayName:"زارية",locale:"ar-SA"},{name:"ar-SY-AmanyNeural",gender:"female",displayName:"أماني",locale:"ar-SY"},{name:"ar-SY-LaithNeural",gender:"male",displayName:"ليث",locale:"ar-SY"},{name:"ar-TN-HediNeural",gender:"male",displayName:"هادي",locale:"ar-TN"},{name:"ar-TN-ReemNeural",gender:"female",displayName:"ريم",locale:"ar-TN"},{name:"ar-AE-FatimaNeural",gender:"female",displayName:"فاطمة",locale:"ar-AE"},{name:"ar-AE-HamdanNeural",gender:"male",displayName:"حمدان",locale:"ar-AE"},{name:"ar-YE-MaryamNeural",gender:"female",displayName:"مريم",locale:"ar-YE"},{name:"ar-YE-SalehNeural",gender:"male",displayName:"صالح",locale:"ar-YE"},{name:"az-AZ-BabekNeural",gender:"male",displayName:"Babək",locale:"az-AZ"},{name:"az-AZ-BanuNeural",gender:"female",displayName:"Banu",locale:"az-AZ"},{name:"bn-BD-NabanitaNeural",gender:"female",displayName:"নবনীতা",locale:"bn-BD"},{name:"bn-BD-PradeepNeural",gender:"male",displayName:"প্রদ্বীপ",locale:"bn-BD"},{name:"bn-IN-BashkarNeural",gender:"male",displayName:"ভাস্কর",locale:"bn-IN"},{name:"bn-IN-TanishaaNeural",gender:"female",displayName:"তানিশা",locale:"bn-IN"},{name:"bs-BA-VesnaNeural",gender:"female",displayName:"Vesna",locale:"bs-BA"},{name:"bs-BA-GoranNeural",gender:"male",displayName:"Goran",locale:"bs-BA"},{name:"bg-BG-BorislavNeural",gender:"male",displayName:"Борислав",locale:"bg-BG"},{name:"bg-BG-KalinaNeural",gender:"female",displayName:"Калина",locale:"bg-BG"},{name:"my-MM-NilarNeural",gender:"female",displayName:"နီလာ",locale:"my-MM"},{name:"my-MM-ThihaNeural",gender:"male",displayName:"သီဟ",locale:"my-MM"},{name:"ca-ES-EnricNeural",gender:"male",displayName:"Enric",locale:"ca-ES"},{name:"ca-ES-JoanaNeural",gender:"female",displayName:"Joana",locale:"ca-ES"},{name:"zh-HK-HiuGaaiNeural",gender:"female",displayName:"曉佳",locale:"zh-HK"},{name:"zh-CN-XiaoyiNeural",gender:"female",displayName:"晓伊",locale:"zh-CN"},{name:"zh-CN-YunjianNeural",gender:"male",displayName:"云健",locale:"zh-CN"},{name:"zh-CN-YunxiaNeural",gender:"male",displayName:"云夏",locale:"zh-CN"},{name:"zh-CN-YunyangNeural",gender:"male",displayName:"云扬",locale:"zh-CN"},{name:"zh-CN-liaoning-XiaobeiNeural",gender:"female",displayName:"晓北 辽宁",locale:"zh-CN"},{name:"zh-CN-shaanxi-XiaoniNeural",gender:"female",displayName:"晓妮 陕西",locale:"zh-CN"},{name:"zh-TW-HsiaoYuNeural",gender:"female",displayName:"曉雨",locale:"zh-TW"},{name:"hr-HR-GabrijelaNeural",gender:"female",displayName:"Gabrijela",locale:"hr-HR"},{name:"hr-HR-SreckoNeural",gender:"male",displayName:"Srećko",locale:"hr-HR"},{name:"cs-CZ-AntoninNeural",gender:"male",displayName:"Antonín",locale:"cs-CZ"},{name:"cs-CZ-VlastaNeural",gender:"female",displayName:"Vlasta",locale:"cs-CZ"},{name:"da-DK-ChristelNeural",gender:"female",displayName:"Christel",locale:"da-DK"},{name:"da-DK-JeppeNeural",gender:"male",displayName:"Jeppe",locale:"da-DK"},{name:"nl-BE-ArnaudNeural",gender:"male",displayName:"Arnaud",locale:"nl-BE"},{name:"nl-BE-DenaNeural",gender:"female",displayName:"Dena",locale:"nl-BE"},{name:"nl-NL-ColetteNeural",gender:"female",displayName:"Colette",locale:"nl-NL"},{name:"nl-NL-FennaNeural",gender:"female",displayName:"Fenna",locale:"nl-NL"},{name:"nl-NL-MaartenNeural",gender:"male",displayName:"Maarten",locale:"nl-NL"},{name:"en-AU-WilliamMultilingualNeural",gender:"male",displayName:"William Multilingual",locale:"en-AU"},{name:"en-AU-NatashaNeural",gender:"female",displayName:"Natasha",locale:"en-AU"},{name:"en-CA-ClaraNeural",gender:"female",displayName:"Clara",locale:"en-CA"},{name:"en-CA-LiamNeural",gender:"male",displayName:"Liam",locale:"en-CA"},{name:"en-HK-YanNeural",gender:"female",displayName:"Yan",locale:"en-HK"},{name:"en-HK-SamNeural",gender:"male",displayName:"Sam",locale:"en-HK"},{name:"en-IN-NeerjaNeural",gender:"female",displayName:"Neerja",locale:"en-IN"},{name:"en-IN-PrabhatNeural",gender:"male",displayName:"Prabhat",locale:"en-IN"},{name:"en-IE-ConnorNeural",gender:"male",displayName:"Connor",locale:"en-IE"},{name:"en-IE-EmilyNeural",gender:"female",displayName:"Emily",locale:"en-IE"},{name:"en-KE-AsiliaNeural",gender:"female",displayName:"Asilia",locale:"en-KE"},{name:"en-KE-ChilembaNeural",gender:"male",displayName:"Chilemba",locale:"en-KE"},{name:"en-NZ-MitchellNeural",gender:"male",displayName:"Mitchell",locale:"en-NZ"},{name:"en-NZ-MollyNeural",gender:"female",displayName:"Molly",locale:"en-NZ"},{name:"en-NG-AbeoNeural",gender:"male",displayName:"Abeo",locale:"en-NG"},{name:"en-NG-EzinneNeural",gender:"female",displayName:"Ezinne",locale:"en-NG"},{name:"en-PH-JamesNeural",gender:"male",displayName:"James",locale:"en-PH"},{name:"en-PH-RosaNeural",gender:"female",displayName:"Rosa",locale:"en-PH"},{name:"en-US-AvaNeural",gender:"female",displayName:"Ava",locale:"en-US"},{name:"en-US-AndrewNeural",gender:"male",displayName:"Andrew",locale:"en-US"},{name:"en-US-EmmaNeural",gender:"female",displayName:"Emma",locale:"en-US"},{name:"en-US-BrianNeural",gender:"male",displayName:"Brian",locale:"en-US"},{name:"en-SG-LunaNeural",gender:"female",displayName:"Luna",locale:"en-SG"},{name:"en-SG-WayneNeural",gender:"male",displayName:"Wayne",locale:"en-SG"},{name:"en-ZA-LeahNeural",gender:"female",displayName:"Leah",locale:"en-ZA"},{name:"en-ZA-LukeNeural",gender:"male",displayName:"Luke",locale:"en-ZA"},{name:"en-TZ-ElimuNeural",gender:"male",displayName:"Elimu",locale:"en-TZ"},{name:"en-TZ-ImaniNeural",gender:"female",displayName:"Imani",locale:"en-TZ"},{name:"en-GB-MaisieNeural",gender:"female",displayName:"Maisie",locale:"en-GB"},{name:"en-GB-ThomasNeural",gender:"male",displayName:"Thomas",locale:"en-GB"},{name:"en-US-AnaNeural",gender:"female",displayName:"Ana",locale:"en-US"},{name:"en-US-AndrewMultilingualNeural",gender:"male",displayName:"Andrew Multilingual",locale:"en-US"},{name:"en-US-AvaMultilingualNeural",gender:"female",displayName:"Ava Multilingual",locale:"en-US"},{name:"en-US-BrianMultilingualNeural",gender:"male",displayName:"Brian Multilingual",locale:"en-US"},{name:"en-US-EmmaMultilingualNeural",gender:"female",displayName:"Emma Multilingual",locale:"en-US"},{name:"en-US-RogerNeural",gender:"male",displayName:"Roger",locale:"en-US"},{name:"en-US-SteffanNeural",gender:"male",displayName:"Steffan",locale:"en-US"},{name:"et-EE-AnuNeural",gender:"female",displayName:"Anu",locale:"et-EE"},{name:"et-EE-KertNeural",gender:"male",displayName:"Kert",locale:"et-EE"},{name:"fil-PH-AngeloNeural",gender:"male",displayName:"Angelo",locale:"fil-PH"},{name:"fil-PH-BlessicaNeural",gender:"female",displayName:"Blessica",locale:"fil-PH"},{name:"fi-FI-HarriNeural",gender:"male",displayName:"Harri",locale:"fi-FI"},{name:"fi-FI-NooraNeural",gender:"female",displayName:"Noora",locale:"fi-FI"},{name:"fr-BE-CharlineNeural",gender:"female",displayName:"Charline",locale:"fr-BE"},{name:"fr-BE-GerardNeural",gender:"male",displayName:"Gerard",locale:"fr-BE"},{name:"fr-CA-ThierryNeural",gender:"male",displayName:"Thierry",locale:"fr-CA"},{name:"fr-CA-AntoineNeural",gender:"male",displayName:"Antoine",locale:"fr-CA"},{name:"fr-CA-JeanNeural",gender:"male",displayName:"Jean",locale:"fr-CA"},{name:"fr-CA-SylvieNeural",gender:"female",displayName:"Sylvie",locale:"fr-CA"},{name:"fr-FR-VivienneMultilingualNeural",gender:"female",displayName:"Vivienne Multilingue",locale:"fr-FR"},{name:"fr-FR-RemyMultilingualNeural",gender:"male",displayName:"Rémy Multilingue",locale:"fr-FR"},{name:"fr-FR-EloiseNeural",gender:"female",displayName:"Eloise",locale:"fr-FR"},{name:"fr-CH-ArianeNeural",gender:"female",displayName:"Ariane",locale:"fr-CH"},{name:"fr-CH-FabriceNeural",gender:"male",displayName:"Fabrice",locale:"fr-CH"},{name:"gl-ES-RoiNeural",gender:"male",displayName:"Roi",locale:"gl-ES"},{name:"gl-ES-SabelaNeural",gender:"female",displayName:"Sabela",locale:"gl-ES"},{name:"ka-GE-EkaNeural",gender:"female",displayName:"ეკა",locale:"ka-GE"},{name:"ka-GE-GiorgiNeural",gender:"male",displayName:"გიორგი",locale:"ka-GE"},{name:"de-AT-IngridNeural",gender:"female",displayName:"Ingrid",locale:"de-AT"},{name:"de-AT-JonasNeural",gender:"male",displayName:"Jonas",locale:"de-AT"},{name:"de-DE-SeraphinaMultilingualNeural",gender:"female",displayName:"Seraphine Mehrsprachig",locale:"de-DE"},{name:"de-DE-FlorianMultilingualNeural",gender:"male",displayName:"Florian Mehrsprachig",locale:"de-DE"},{name:"de-DE-KillianNeural",gender:"male",displayName:"Killian",locale:"de-DE"},{name:"de-CH-JanNeural",gender:"male",displayName:"Jan",locale:"de-CH"},{name:"de-CH-LeniNeural",gender:"female",displayName:"Leni",locale:"de-CH"},{name:"el-GR-AthinaNeural",gender:"female",displayName:"Αθηνά",locale:"el-GR"},{name:"el-GR-NestorasNeural",gender:"male",displayName:"Νέστορας",locale:"el-GR"},{name:"gu-IN-DhwaniNeural",gender:"female",displayName:"ધ્વની",locale:"gu-IN"},{name:"gu-IN-NiranjanNeural",gender:"male",displayName:"નિરંજન",locale:"gu-IN"},{name:"he-IL-AvriNeural",gender:"male",displayName:"אברי",locale:"he-IL"},{name:"he-IL-HilaNeural",gender:"female",displayName:"הילה",locale:"he-IL"},{name:"hi-IN-MadhurNeural",gender:"male",displayName:"मधुर",locale:"hi-IN"},{name:"hi-IN-SwaraNeural",gender:"female",displayName:"स्वरा",locale:"hi-IN"},{name:"hu-HU-NoemiNeural",gender:"female",displayName:"Noémi",locale:"hu-HU"},{name:"hu-HU-TamasNeural",gender:"male",displayName:"Tamás",locale:"hu-HU"},{name:"is-IS-GudrunNeural",gender:"female",displayName:"Guðrún",locale:"is-IS"},{name:"is-IS-GunnarNeural",gender:"male",displayName:"Gunnar",locale:"is-IS"},{name:"id-ID-ArdiNeural",gender:"male",displayName:"Ardi",locale:"id-ID"},{name:"id-ID-GadisNeural",gender:"female",displayName:"Gadis",locale:"id-ID"},{name:"iu-Latn-CA-SiqiniqNeural",gender:"female",displayName:"ᓯᕿᓂᖅ",locale:"iu-Latn-CA"},{name:"iu-Latn-CA-TaqqiqNeural",gender:"male",displayName:"ᑕᖅᑭᖅ",locale:"iu-Latn-CA"},{name:"iu-Cans-CA-SiqiniqNeural",gender:"female",displayName:"ᓯᕿᓂᖅ",locale:"iu-Cans-CA"},{name:"iu-Cans-CA-TaqqiqNeural",gender:"male",displayName:"ᑕᖅᑭᖅ",locale:"iu-Cans-CA"},{name:"ga-IE-ColmNeural",gender:"male",displayName:"Colm",locale:"ga-IE"},{name:"ga-IE-OrlaNeural",gender:"female",displayName:"Orla",locale:"ga-IE"},{name:"it-IT-GiuseppeMultilingualNeural",gender:"male",displayName:"Giuseppe Multilingual",locale:"it-IT"},{name:"jv-ID-DimasNeural",gender:"male",displayName:"Dimas",locale:"jv-ID"},{name:"jv-ID-SitiNeural",gender:"female",displayName:"Siti",locale:"jv-ID"},{name:"kn-IN-GaganNeural",gender:"male",displayName:"ಗಗನ್",locale:"kn-IN"},{name:"kn-IN-SapnaNeural",gender:"female",displayName:"ಸಪ್ನಾ",locale:"kn-IN"},{name:"kk-KZ-AigulNeural",gender:"female",displayName:"Айгүл",locale:"kk-KZ"},{name:"kk-KZ-DauletNeural",gender:"male",displayName:"Дәулет",locale:"kk-KZ"},{name:"km-KH-PisethNeural",gender:"male",displayName:"ពិសិដ្ឋ",locale:"km-KH"},{name:"km-KH-SreymomNeural",gender:"female",displayName:"ស្រីមុំ",locale:"km-KH"},{name:"ko-KR-HyunsuMultilingualNeural",gender:"male",displayName:"Hyunsu Multilingual",locale:"ko-KR"},{name:"lo-LA-ChanthavongNeural",gender:"male",displayName:"ຈັນທະວົງ",locale:"lo-LA"},{name:"lo-LA-KeomanyNeural",gender:"female",displayName:"ແກ້ວມະນີ",locale:"lo-LA"},{name:"lv-LV-EveritaNeural",gender:"female",displayName:"Everita",locale:"lv-LV"},{name:"lv-LV-NilsNeural",gender:"male",displayName:"Nils",locale:"lv-LV"},{name:"lt-LT-LeonasNeural",gender:"male",displayName:"Leonas",locale:"lt-LT"},{name:"lt-LT-OnaNeural",gender:"female",displayName:"Ona",locale:"lt-LT"},{name:"mk-MK-AleksandarNeural",gender:"male",displayName:"Александар",locale:"mk-MK"},{name:"mk-MK-MarijaNeural",gender:"female",displayName:"Марија",locale:"mk-MK"},{name:"ms-MY-OsmanNeural",gender:"male",displayName:"Osman",locale:"ms-MY"},{name:"ms-MY-YasminNeural",gender:"female",displayName:"Yasmin",locale:"ms-MY"},{name:"ml-IN-MidhunNeural",gender:"male",displayName:"മിഥുൻ",locale:"ml-IN"},{name:"ml-IN-SobhanaNeural",gender:"female",displayName:"ശോഭന",locale:"ml-IN"},{name:"mt-MT-GraceNeural",gender:"female",displayName:"Grace",locale:"mt-MT"},{name:"mt-MT-JosephNeural",gender:"male",displayName:"Joseph",locale:"mt-MT"},{name:"mr-IN-AarohiNeural",gender:"female",displayName:"आरोही",locale:"mr-IN"},{name:"mr-IN-ManoharNeural",gender:"male",displayName:"मनोहर",locale:"mr-IN"},{name:"mn-MN-BataaNeural",gender:"male",displayName:"Батаа",locale:"mn-MN"},{name:"mn-MN-YesuiNeural",gender:"female",displayName:"Есүй",locale:"mn-MN"},{name:"ne-NP-HemkalaNeural",gender:"female",displayName:"हेमकला",locale:"ne-NP"},{name:"ne-NP-SagarNeural",gender:"male",displayName:"सागर",locale:"ne-NP"},{name:"nb-NO-FinnNeural",gender:"male",displayName:"Finn",locale:"nb-NO"},{name:"nb-NO-PernilleNeural",gender:"female",displayName:"Pernille",locale:"nb-NO"},{name:"ps-AF-GulNawazNeural",gender:"male",displayName:" ګل نواز",locale:"ps-AF"},{name:"ps-AF-LatifaNeural",gender:"female",displayName:"لطيفه",locale:"ps-AF"},{name:"fa-IR-DilaraNeural",gender:"female",displayName:"دلارا",locale:"fa-IR"},{name:"fa-IR-FaridNeural",gender:"male",displayName:"فرید",locale:"fa-IR"},{name:"pl-PL-MarekNeural",gender:"male",displayName:"Marek",locale:"pl-PL"},{name:"pl-PL-ZofiaNeural",gender:"female",displayName:"Zofia",locale:"pl-PL"},{name:"pt-BR-ThalitaMultilingualNeural",gender:"female",displayName:"Thalita multilíngue",locale:"pt-BR"},{name:"ro-RO-AlinaNeural",gender:"female",displayName:"Alina",locale:"ro-RO"},{name:"ro-RO-EmilNeural",gender:"male",displayName:"Emil",locale:"ro-RO"},{name:"sr-RS-NicholasNeural",gender:"male",displayName:"Никола",locale:"sr-RS"},{name:"sr-RS-SophieNeural",gender:"female",displayName:"Софија",locale:"sr-RS"},{name:"si-LK-SameeraNeural",gender:"male",displayName:"සමීර",locale:"si-LK"},{name:"si-LK-ThiliniNeural",gender:"female",displayName:"තිළිණි",locale:"si-LK"},{name:"sk-SK-LukasNeural",gender:"male",displayName:"Lukáš",locale:"sk-SK"},{name:"sk-SK-ViktoriaNeural",gender:"female",displayName:"Viktória",locale:"sk-SK"},{name:"sl-SI-PetraNeural",gender:"female",displayName:"Petra",locale:"sl-SI"},{name:"sl-SI-RokNeural",gender:"male",displayName:"Rok",locale:"sl-SI"},{name:"so-SO-MuuseNeural",gender:"male",displayName:"Muuse",locale:"so-SO"},{name:"so-SO-UbaxNeural",gender:"female",displayName:"Ubax",locale:"so-SO"},{name:"es-AR-ElenaNeural",gender:"female",displayName:"Elena",locale:"es-AR"},{name:"es-AR-TomasNeural",gender:"male",displayName:"Tomas",locale:"es-AR"},{name:"es-BO-MarceloNeural",gender:"male",displayName:"Marcelo",locale:"es-BO"},{name:"es-BO-SofiaNeural",gender:"female",displayName:"Sofia",locale:"es-BO"},{name:"es-CL-CatalinaNeural",gender:"female",displayName:"Catalina",locale:"es-CL"},{name:"es-CL-LorenzoNeural",gender:"male",displayName:"Lorenzo",locale:"es-CL"},{name:"es-CO-GonzaloNeural",gender:"male",displayName:"Gonzalo",locale:"es-CO"},{name:"es-CO-SalomeNeural",gender:"female",displayName:"Salome",locale:"es-CO"},{name:"es-ES-XimenaNeural",gender:"female",displayName:"Ximena",locale:"es-ES"},{name:"es-CR-JuanNeural",gender:"male",displayName:"Juan",locale:"es-CR"},{name:"es-CR-MariaNeural",gender:"female",displayName:"María",locale:"es-CR"},{name:"es-CU-BelkysNeural",gender:"female",displayName:"Belkys",locale:"es-CU"},{name:"es-CU-ManuelNeural",gender:"male",displayName:"Manuel",locale:"es-CU"},{name:"es-DO-EmilioNeural",gender:"male",displayName:"Emilio",locale:"es-DO"},{name:"es-DO-RamonaNeural",gender:"female",displayName:"Ramona",locale:"es-DO"},{name:"es-EC-AndreaNeural",gender:"female",displayName:"Andrea",locale:"es-EC"},{name:"es-EC-LuisNeural",gender:"male",displayName:"Luis",locale:"es-EC"},{name:"es-SV-LorenaNeural",gender:"female",displayName:"Lorena",locale:"es-SV"},{name:"es-SV-RodrigoNeural",gender:"male",displayName:"Rodrigo",locale:"es-SV"},{name:"es-GQ-JavierNeural",gender:"male",displayName:"Javier",locale:"es-GQ"},{name:"es-GQ-TeresaNeural",gender:"female",displayName:"Teresa",locale:"es-GQ"},{name:"es-GT-AndresNeural",gender:"male",displayName:"Andrés",locale:"es-GT"},{name:"es-GT-MartaNeural",gender:"female",displayName:"Marta",locale:"es-GT"},{name:"es-HN-CarlosNeural",gender:"male",displayName:"Carlos",locale:"es-HN"},{name:"es-HN-KarlaNeural",gender:"female",displayName:"Karla",locale:"es-HN"},{name:"es-MX-DaliaNeural",gender:"female",displayName:"Dalia",locale:"es-MX"},{name:"es-MX-JorgeNeural",gender:"male",displayName:"Jorge",locale:"es-MX"},{name:"es-NI-FedericoNeural",gender:"male",displayName:"Federico",locale:"es-NI"},{name:"es-NI-YolandaNeural",gender:"female",displayName:"Yolanda",locale:"es-NI"},{name:"es-PA-MargaritaNeural",gender:"female",displayName:"Margarita",locale:"es-PA"},{name:"es-PA-RobertoNeural",gender:"male",displayName:"Roberto",locale:"es-PA"},{name:"es-PY-MarioNeural",gender:"male",displayName:"Mario",locale:"es-PY"},{name:"es-PY-TaniaNeural",gender:"female",displayName:"Tania",locale:"es-PY"},{name:"es-PE-AlexNeural",gender:"male",displayName:"Alex",locale:"es-PE"},{name:"es-PE-CamilaNeural",gender:"female",displayName:"Camila",locale:"es-PE"},{name:"es-PR-KarinaNeural",gender:"female",displayName:"Karina",locale:"es-PR"},{name:"es-PR-VictorNeural",gender:"male",displayName:"Víctor",locale:"es-PR"},{name:"es-US-AlonsoNeural",gender:"male",displayName:"Alonso",locale:"es-US"},{name:"es-US-PalomaNeural",gender:"female",displayName:"Paloma",locale:"es-US"},{name:"es-UY-MateoNeural",gender:"male",displayName:"Mateo",locale:"es-UY"},{name:"es-UY-ValentinaNeural",gender:"female",displayName:"Valentina",locale:"es-UY"},{name:"es-VE-PaolaNeural",gender:"female",displayName:"Paola",locale:"es-VE"},{name:"es-VE-SebastianNeural",gender:"male",displayName:"Sebastián",locale:"es-VE"},{name:"su-ID-JajangNeural",gender:"male",displayName:"Jajang",locale:"su-ID"},{name:"su-ID-TutiNeural",gender:"female",displayName:"Tuti",locale:"su-ID"},{name:"sw-KE-RafikiNeural",gender:"male",displayName:"Rafiki",locale:"sw-KE"},{name:"sw-KE-ZuriNeural",gender:"female",displayName:"Zuri",locale:"sw-KE"},{name:"sw-TZ-DaudiNeural",gender:"male",displayName:"Daudi",locale:"sw-TZ"},{name:"sw-TZ-RehemaNeural",gender:"female",displayName:"Rehema",locale:"sw-TZ"},{name:"sv-SE-MattiasNeural",gender:"male",displayName:"Mattias",locale:"sv-SE"},{name:"sv-SE-SofieNeural",gender:"female",displayName:"Sofie",locale:"sv-SE"},{name:"ta-IN-PallaviNeural",gender:"female",displayName:"பல்லவி",locale:"ta-IN"},{name:"ta-IN-ValluvarNeural",gender:"male",displayName:"வள்ளுவர்",locale:"ta-IN"},{name:"ta-MY-KaniNeural",gender:"female",displayName:"கனி",locale:"ta-MY"},{name:"ta-MY-SuryaNeural",gender:"male",displayName:"சூர்யா",locale:"ta-MY"},{name:"ta-SG-AnbuNeural",gender:"male",displayName:"அன்பு",locale:"ta-SG"},{name:"ta-SG-VenbaNeural",gender:"female",displayName:"வெண்பா",locale:"ta-SG"},{name:"ta-LK-KumarNeural",gender:"male",displayName:"குமார்",locale:"ta-LK"},{name:"ta-LK-SaranyaNeural",gender:"female",displayName:"சரண்யா",locale:"ta-LK"},{name:"te-IN-MohanNeural",gender:"male",displayName:"మోహన్",locale:"te-IN"},{name:"te-IN-ShrutiNeural",gender:"female",displayName:"శ్రుతి",locale:"te-IN"},{name:"th-TH-NiwatNeural",gender:"male",displayName:"นิวัฒน์",locale:"th-TH"},{name:"th-TH-PremwadeeNeural",gender:"female",displayName:"เปรมวดี",locale:"th-TH"},{name:"tr-TR-EmelNeural",gender:"female",displayName:"Emel",locale:"tr-TR"},{name:"tr-TR-AhmetNeural",gender:"male",displayName:"Ahmet",locale:"tr-TR"},{name:"uk-UA-OstapNeural",gender:"male",displayName:"Остап",locale:"uk-UA"},{name:"uk-UA-PolinaNeural",gender:"female",displayName:"Поліна",locale:"uk-UA"},{name:"ur-IN-GulNeural",gender:"female",displayName:"گل",locale:"ur-IN"},{name:"ur-IN-SalmanNeural",gender:"male",displayName:"سلمان",locale:"ur-IN"},{name:"ur-PK-AsadNeural",gender:"male",displayName:"اسد",locale:"ur-PK"},{name:"ur-PK-UzmaNeural",gender:"female",displayName:"عظمیٰ",locale:"ur-PK"},{name:"uz-UZ-MadinaNeural",gender:"female",displayName:"Madina",locale:"uz-UZ"},{name:"uz-UZ-SardorNeural",gender:"male",displayName:"Sardor",locale:"uz-UZ"},{name:"vi-VN-HoaiMyNeural",gender:"female",displayName:"Hoài My",locale:"vi-VN"},{name:"vi-VN-NamMinhNeural",gender:"male",displayName:"Nam Minh",locale:"vi-VN"},{name:"cy-GB-AledNeural",gender:"male",displayName:"Aled",locale:"cy-GB"},{name:"cy-GB-NiaNeural",gender:"female",displayName:"Nia",locale:"cy-GB"},{name:"zu-ZA-ThandoNeural",gender:"female",displayName:"Thando",locale:"zu-ZA"},{name:"zu-ZA-ThembaNeural",gender:"male",displayName:"Themba",locale:"zu-ZA"},{name:"as-IN-YashicaNeural",gender:"female",displayName:"যাশিকা",locale:"as-IN"},{name:"as-IN-PriyomNeural",gender:"male",displayName:"প্ৰিয়ম",locale:"as-IN"},{name:"ca-ES-AlbaNeural",gender:"female",displayName:"Alba",locale:"ca-ES"},{name:"de-DE-ChristophNeural",gender:"male",displayName:"Christoph",locale:"de-DE"},{name:"de-DE-ElkeNeural",gender:"female",displayName:"Elke",locale:"de-DE"},{name:"de-DE-GiselaNeural",gender:"female",displayName:"Gisela",locale:"de-DE"},{name:"de-DE-KasperNeural",gender:"male",displayName:"Kasper",locale:"de-DE"},{name:"de-DE-KlarissaNeural",gender:"female",displayName:"Klarissa",locale:"de-DE"},{name:"de-DE-KlausNeural",gender:"male",displayName:"Klaus",locale:"de-DE"},{name:"de-DE-LouisaNeural",gender:"female",displayName:"Louisa",locale:"de-DE"},{name:"de-DE-MajaNeural",gender:"female",displayName:"Maja",locale:"de-DE"},{name:"de-DE-RalfNeural",gender:"male",displayName:"Ralf",locale:"de-DE"},{name:"de-DE-TanjaNeural",gender:"female",displayName:"Tanja",locale:"de-DE"},{name:"en-AU-WilliamNeural",gender:"male",displayName:"William",locale:"en-AU"},{name:"en-AU-AnnetteNeural",gender:"female",displayName:"Annette",locale:"en-AU"},{name:"en-AU-CarlyNeural",gender:"female",displayName:"Carly",locale:"en-AU"},{name:"en-AU-DarrenNeural",gender:"male",displayName:"Darren",locale:"en-AU"},{name:"en-AU-DuncanNeural",gender:"male",displayName:"Duncan",locale:"en-AU"},{name:"en-AU-ElsieNeural",gender:"female",displayName:"Elsie",locale:"en-AU"},{name:"en-AU-FreyaNeural",gender:"female",displayName:"Freya",locale:"en-AU"},{name:"en-AU-JoanneNeural",gender:"female",displayName:"Joanne",locale:"en-AU"},{name:"en-AU-KenNeural",gender:"male",displayName:"Ken",locale:"en-AU"},{name:"en-AU-KimNeural",gender:"female",displayName:"Kim",locale:"en-AU"},{name:"en-AU-NeilNeural",gender:"male",displayName:"Neil",locale:"en-AU"},{name:"en-AU-TimNeural",gender:"male",displayName:"Tim",locale:"en-AU"},{name:"en-AU-TinaNeural",gender:"female",displayName:"Tina",locale:"en-AU"},{name:"en-GB-AdaMultilingualNeural",gender:"female",displayName:"Ada Multilingual",locale:"en-GB"},{name:"en-GB-OllieMultilingualNeural",gender:"male",displayName:"Ollie Multilingual",locale:"en-GB"},{name:"en-GB-AbbiNeural",gender:"female",displayName:"Abbi",locale:"en-GB"},{name:"en-GB-AlfieNeural",gender:"male",displayName:"Alfie",locale:"en-GB"},{name:"en-GB-BellaNeural",gender:"female",displayName:"Bella",locale:"en-GB"},{name:"en-GB-ElliotNeural",gender:"male",displayName:"Elliot",locale:"en-GB"},{name:"en-GB-EthanNeural",gender:"male",displayName:"Ethan",locale:"en-GB"},{name:"en-GB-HollieNeural",gender:"female",displayName:"Hollie",locale:"en-GB"},{name:"en-GB-NoahNeural",gender:"male",displayName:"Noah",locale:"en-GB"},{name:"en-GB-OliverNeural",gender:"male",displayName:"Oliver",locale:"en-GB"},{name:"en-GB-OliviaNeural",gender:"female",displayName:"Olivia",locale:"en-GB"},{name:"en-GB-MiaNeural",gender:"female",displayName:"Mia",locale:"en-GB"},{name:"en-IN-AartiIndicNeural",gender:"female",displayName:"Aarti Indic",locale:"en-IN"},{name:"en-IN-ArjunIndicNeural",gender:"male",displayName:"Arjun Indic",locale:"en-IN"},{name:"en-IN-NeerjaIndicNeural",gender:"female",displayName:"Neerja Indic",locale:"en-IN"},{name:"en-IN-PrabhatIndicNeural",gender:"male",displayName:"Prabhat Indic",locale:"en-IN"},{name:"en-IN-AaravNeural",gender:"male",displayName:"Aarav",locale:"en-IN"},{name:"en-IN-AashiNeural",gender:"female",displayName:"Aashi",locale:"en-IN"},{name:"en-IN-AartiNeural",gender:"female",displayName:"Aarti",locale:"en-IN"},{name:"en-IN-ArjunNeural",gender:"male",displayName:"Arjun",locale:"en-IN"},{name:"en-IN-AnanyaNeural",gender:"female",displayName:"Ananya",locale:"en-IN"},{name:"en-IN-KavyaNeural",gender:"female",displayName:"Kavya",locale:"en-IN"},{name:"en-IN-KunalNeural",gender:"male",displayName:"Kunal",locale:"en-IN"},{name:"en-IN-RehaanNeural",gender:"male",displayName:"Rehaan",locale:"en-IN"},{name:"en-US-AmandaMultilingualNeural",gender:"female",displayName:"Amanda Multilingual",locale:"en-US"},{name:"en-US-AdamMultilingualNeural",gender:"male",displayName:"Adam Multilingual",locale:"en-US"},{name:"en-US-PhoebeMultilingualNeural",gender:"female",displayName:"Phoebe Multilingual",locale:"en-US"},{name:"en-US-AlloyTurboMultilingualNeural",gender:"male",displayName:"Alloy Turbo Multilingual",locale:"en-US"},{name:"en-US-EchoTurboMultilingualNeural",gender:"male",displayName:"Echo Turbo Multilingual",locale:"en-US"},{name:"en-US-FableTurboMultilingualNeural",gender:"female",displayName:"Fable Turbo Multilingual",locale:"en-US"},{name:"en-US-OnyxTurboMultilingualNeural",gender:"male",displayName:"Onyx Turbo Multilingual",locale:"en-US"},{name:"en-US-NovaTurboMultilingualNeural",gender:"female",displayName:"Nova Turbo Multilingual",locale:"en-US"},{name:"en-US-ShimmerTurboMultilingualNeural",gender:"female",displayName:"Shimmer Turbo Multilingual",locale:"en-US"},{name:"en-US-JasonNeural",gender:"male",displayName:"Jason",locale:"en-US"},{name:"en-US-KaiNeural",gender:"male",displayName:"Kai",locale:"en-US"},{name:"en-US-LunaNeural",gender:"female",displayName:"Luna",locale:"en-US"},{name:"en-US-TonyNeural",gender:"male",displayName:"Tony",locale:"en-US"},{name:"en-US-NancyNeural",gender:"female",displayName:"Nancy",locale:"en-US"},{name:"en-US-CoraMultilingualNeural",gender:"female",displayName:"Cora Multilingual",locale:"en-US"},{name:"en-US-ChristopherMultilingualNeural",gender:"male",displayName:"Christopher Multilingual",locale:"en-US"},{name:"en-US-BrandonMultilingualNeural",gender:"male",displayName:"Brandon Multilingual",locale:"en-US"},{name:"en-US-AshleyNeural",gender:"female",displayName:"Ashley",locale:"en-US"},{name:"en-US-BrandonNeural",gender:"male",displayName:"Brandon",locale:"en-US"},{name:"en-US-CoraNeural",gender:"female",displayName:"Cora",locale:"en-US"},{name:"en-US-DavisMultilingualNeural",gender:"male",displayName:"Davis Multilingual",locale:"en-US"},{name:"en-US-DerekMultilingualNeural",gender:"male",displayName:"Derek Multilingual",locale:"en-US"},{name:"en-US-DustinMultilingualNeural",gender:"male",displayName:"Dustin Multilingual",locale:"en-US"},{name:"en-US-ElizabethNeural",gender:"female",displayName:"Elizabeth",locale:"en-US"},{name:"en-US-JacobNeural",gender:"male",displayName:"Jacob",locale:"en-US"},{name:"en-US-JennyMultilingualNeural",gender:"female",displayName:"Jenny Multilingual",locale:"en-US"},{name:"en-US-LewisMultilingualNeural",gender:"male",displayName:"Lewis Multilingual",locale:"en-US"},{name:"en-US-LolaMultilingualNeural",gender:"female",displayName:"Lola Multilingual",locale:"en-US"},{name:"en-US-MonicaNeural",gender:"female",displayName:"Monica",locale:"en-US"},{name:"en-US-NancyMultilingualNeural",gender:"female",displayName:"Nancy Multilingual",locale:"en-US"},{name:"en-US-RyanMultilingualNeural",gender:"male",displayName:"Ryan Multilingual",locale:"en-US"},{name:"en-US-SamuelMultilingualNeural",gender:"male",displayName:"Samuel Multilingual",locale:"en-US"},{name:"en-US-SerenaMultilingualNeural",gender:"female",displayName:"Serena Multilingual",locale:"en-US"},{name:"en-US-SteffanMultilingualNeural",gender:"male",displayName:"Steffan Multilingual",locale:"en-US"},{name:"en-US-AIGenerate1Neural",gender:"male",displayName:"AIGenerate1",locale:"en-US"},{name:"en-US-AIGenerate2Neural",gender:"female",displayName:"AIGenerate2",locale:"en-US"},{name:"en-US-AshTurboMultilingualNeural",gender:"male",displayName:"Ash Turbo Multilingual",locale:"en-US"},{name:"en-US-BlueNeural",gender:"female",displayName:"Blue",locale:"en-US"},{name:"en-US-EvelynMultilingualNeural",gender:"female",displayName:"Evelyn Multilingual",locale:"en-US"},{name:"es-ES-ArabellaMultilingualNeural",gender:"female",displayName:"Arabella Multilingual",locale:"es-ES"},{name:"es-ES-IsidoraMultilingualNeural",gender:"female",displayName:"Isidora Multilingual",locale:"es-ES"},{name:"es-ES-TristanMultilingualNeural",gender:"male",displayName:"Tristan Multilingual",locale:"es-ES"},{name:"es-ES-XimenaMultilingualNeural",gender:"female",displayName:"Ximena Multilingual",locale:"es-ES"},{name:"es-ES-DarioNeural",gender:"male",displayName:"Dario",locale:"es-ES"},{name:"es-ES-EliasNeural",gender:"male",displayName:"Elias",locale:"es-ES"},{name:"es-ES-EstrellaNeural",gender:"female",displayName:"Estrella",locale:"es-ES"},{name:"es-ES-IreneNeural",gender:"female",displayName:"Irene",locale:"es-ES"},{name:"es-ES-LaiaNeural",gender:"female",displayName:"Laia",locale:"es-ES"},{name:"es-ES-LiaNeural",gender:"female",displayName:"Lia",locale:"es-ES"},{name:"es-ES-NilNeural",gender:"male",displayName:"Nil",locale:"es-ES"},{name:"es-ES-SaulNeural",gender:"male",displayName:"Saul",locale:"es-ES"},{name:"es-ES-TeoNeural",gender:"male",displayName:"Teo",locale:"es-ES"},{name:"es-ES-TrianaNeural",gender:"female",displayName:"Triana",locale:"es-ES"},{name:"es-ES-VeraNeural",gender:"female",displayName:"Vera",locale:"es-ES"},{name:"es-MX-DaliaMultilingualNeural",gender:"female",displayName:"Dalia Multilingual",locale:"es-MX"},{name:"es-MX-JorgeMultilingualNeural",gender:"male",displayName:"Jorge Multilingual",locale:"es-MX"},{name:"es-MX-BeatrizNeural",gender:"female",displayName:"Beatriz",locale:"es-MX"},{name:"es-MX-CandelaNeural",gender:"female",displayName:"Candela",locale:"es-MX"},{name:"es-MX-CarlotaNeural",gender:"female",displayName:"Carlota",locale:"es-MX"},{name:"es-MX-CecilioNeural",gender:"male",displayName:"Cecilio",locale:"es-MX"},{name:"es-MX-GerardoNeural",gender:"male",displayName:"Gerardo",locale:"es-MX"},{name:"es-MX-LarissaNeural",gender:"female",displayName:"Larissa",locale:"es-MX"},{name:"es-MX-LibertoNeural",gender:"male",displayName:"Liberto",locale:"es-MX"},{name:"es-MX-LucianoNeural",gender:"male",displayName:"Luciano",locale:"es-MX"},{name:"es-MX-MarinaNeural",gender:"female",displayName:"Marina",locale:"es-MX"},{name:"es-MX-NuriaNeural",gender:"female",displayName:"Nuria",locale:"es-MX"},{name:"es-MX-PelayoNeural",gender:"male",displayName:"Pelayo",locale:"es-MX"},{name:"es-MX-RenataNeural",gender:"female",displayName:"Renata",locale:"es-MX"},{name:"es-MX-YagoNeural",gender:"male",displayName:"Yago",locale:"es-MX"},{name:"eu-ES-AinhoaNeural",gender:"female",displayName:"Ainhoa",locale:"eu-ES"},{name:"eu-ES-AnderNeural",gender:"male",displayName:"Ander",locale:"eu-ES"},{name:"fi-FI-SelmaNeural",gender:"female",displayName:"Selma",locale:"fi-FI"},{name:"fr-FR-LucienMultilingualNeural",gender:"male",displayName:"Lucien Multilingual",locale:"fr-FR"},{name:"fr-FR-AlainNeural",gender:"male",displayName:"Alain",locale:"fr-FR"},{name:"fr-FR-BrigitteNeural",gender:"female",displayName:"Brigitte",locale:"fr-FR"},{name:"fr-FR-CelesteNeural",gender:"female",displayName:"Celeste",locale:"fr-FR"},{name:"fr-FR-ClaudeNeural",gender:"male",displayName:"Claude",locale:"fr-FR"},{name:"fr-FR-CoralieNeural",gender:"female",displayName:"Coralie",locale:"fr-FR"},{name:"fr-FR-JacquelineNeural",gender:"female",displayName:"Jacqueline",locale:"fr-FR"},{name:"fr-FR-JeromeNeural",gender:"male",displayName:"Jerome",locale:"fr-FR"},{name:"fr-FR-JosephineNeural",gender:"female",displayName:"Josephine",locale:"fr-FR"},{name:"fr-FR-MauriceNeural",gender:"male",displayName:"Maurice",locale:"fr-FR"},{name:"fr-FR-YvesNeural",gender:"male",displayName:"Yves",locale:"fr-FR"},{name:"fr-FR-YvetteNeural",gender:"female",displayName:"Yvette",locale:"fr-FR"},{name:"hi-IN-AaravNeural",gender:"male",displayName:"आरव ",locale:"hi-IN"},{name:"hi-IN-AnanyaNeural",gender:"female",displayName:"अनन्या",locale:"hi-IN"},{name:"hi-IN-AartiNeural",gender:"female",displayName:"आरती",locale:"hi-IN"},{name:"hi-IN-ArjunNeural",gender:"male",displayName:"अर्जुन",locale:"hi-IN"},{name:"hi-IN-KavyaNeural",gender:"female",displayName:"काव्या",locale:"hi-IN"},{name:"hi-IN-KunalNeural",gender:"male",displayName:"कुनाल ",locale:"hi-IN"},{name:"hi-IN-RehaanNeural",gender:"male",displayName:"रेहान",locale:"hi-IN"},{name:"hy-AM-AnahitNeural",gender:"female",displayName:"Անահիտ",locale:"hy-AM"},{name:"hy-AM-HaykNeural",gender:"male",displayName:"Հայկ",locale:"hy-AM"},{name:"it-IT-AlessioMultilingualNeural",gender:"male",displayName:"Alessio Multilingual",locale:"it-IT"},{name:"it-IT-IsabellaMultilingualNeural",gender:"female",displayName:"Isabella Multilingual",locale:"it-IT"},{name:"it-IT-MarcelloMultilingualNeural",gender:"male",displayName:"Marcello Multilingual",locale:"it-IT"},{name:"it-IT-CalimeroNeural",gender:"male",displayName:"Calimero",locale:"it-IT"},{name:"it-IT-CataldoNeural",gender:"male",displayName:"Cataldo",locale:"it-IT"},{name:"it-IT-FabiolaNeural",gender:"female",displayName:"Fabiola",locale:"it-IT"},{name:"it-IT-FiammaNeural",gender:"female",displayName:"Fiamma",locale:"it-IT"},{name:"it-IT-GianniNeural",gender:"male",displayName:"Gianni",locale:"it-IT"},{name:"it-IT-GiuseppeNeural",gender:"male",displayName:"Giuseppe",locale:"it-IT"},{name:"it-IT-ImeldaNeural",gender:"female",displayName:"Imelda",locale:"it-IT"},{name:"it-IT-IrmaNeural",gender:"female",displayName:"Irma",locale:"it-IT"},{name:"it-IT-LisandroNeural",gender:"male",displayName:"Lisandro",locale:"it-IT"},{name:"it-IT-PalmiraNeural",gender:"female",displayName:"Palmira",locale:"it-IT"},{name:"it-IT-PierinaNeural",gender:"female",displayName:"Pierina",locale:"it-IT"},{name:"it-IT-RinaldoNeural",gender:"male",displayName:"Rinaldo",locale:"it-IT"},{name:"ja-JP-AoiNeural",gender:"female",displayName:"碧衣",locale:"ja-JP"},{name:"ja-JP-DaichiNeural",gender:"male",displayName:"大智",locale:"ja-JP"},{name:"ja-JP-MayuNeural",gender:"female",displayName:"真夕",locale:"ja-JP"},{name:"ja-JP-NaokiNeural",gender:"male",displayName:"直紀",locale:"ja-JP"},{name:"ja-JP-ShioriNeural",gender:"female",displayName:"志織",locale:"ja-JP"},{name:"ja-JP-MasaruMultilingualNeural",gender:"male",displayName:"勝 多言語",locale:"ja-JP"},{name:"ko-KR-BongJinNeural",gender:"male",displayName:"봉진",locale:"ko-KR"},{name:"ko-KR-GookMinNeural",gender:"male",displayName:"국민",locale:"ko-KR"},{name:"ko-KR-HyunsuNeural",gender:"male",displayName:"현수",locale:"ko-KR"},{name:"ko-KR-JiMinNeural",gender:"female",displayName:"지민",locale:"ko-KR"},{name:"ko-KR-SeoHyeonNeural",gender:"female",displayName:"서현",locale:"ko-KR"},{name:"ko-KR-YuJinNeural",gender:"female",displayName:"유진",locale:"ko-KR"},{name:"nb-NO-IselinNeural",gender:"female",displayName:"Iselin",locale:"nb-NO"},{name:"or-IN-SubhasiniNeural",gender:"female",displayName:"ସୁଭାସିନୀ",locale:"or-IN"},{name:"or-IN-SukantNeural",gender:"male",displayName:"ସୁକାନ୍ତ",locale:"or-IN"},{name:"pa-IN-OjasNeural",gender:"male",displayName:"ਓਜਸ",locale:"pa-IN"},{name:"pa-IN-VaaniNeural",gender:"female",displayName:"ਵਾਨੀ",locale:"pa-IN"},{name:"pl-PL-AgnieszkaNeural",gender:"female",displayName:"Agnieszka",locale:"pl-PL"},{name:"pt-BR-MacerioMultilingualNeural",gender:"male",displayName:"Macerio Multilingual",locale:"pt-BR"},{name:"pt-BR-BrendaNeural",gender:"female",displayName:"Brenda",locale:"pt-BR"},{name:"pt-BR-DonatoNeural",gender:"male",displayName:"Donato",locale:"pt-BR"},{name:"pt-BR-ElzaNeural",gender:"female",displayName:"Elza",locale:"pt-BR"},{name:"pt-BR-FabioNeural",gender:"male",displayName:"Fabio",locale:"pt-BR"},{name:"pt-BR-GiovannaNeural",gender:"female",displayName:"Giovanna",locale:"pt-BR"},{name:"pt-BR-HumbertoNeural",gender:"male",displayName:"Humberto",locale:"pt-BR"},{name:"pt-BR-JulioNeural",gender:"male",displayName:"Julio",locale:"pt-BR"},{name:"pt-BR-LeilaNeural",gender:"female",displayName:"Leila",locale:"pt-BR"},{name:"pt-BR-LeticiaNeural",gender:"female",displayName:"Leticia",locale:"pt-BR"},{name:"pt-BR-ManuelaNeural",gender:"female",displayName:"Manuela",locale:"pt-BR"},{name:"pt-BR-NicolauNeural",gender:"male",displayName:"Nicolau",locale:"pt-BR"},{name:"pt-BR-ThalitaNeural",gender:"female",displayName:"Thalita",locale:"pt-BR"},{name:"pt-BR-ValerioNeural",gender:"male",displayName:"Valerio",locale:"pt-BR"},{name:"pt-BR-YaraNeural",gender:"female",displayName:"Yara",locale:"pt-BR"},{name:"pt-PT-FernandaNeural",gender:"female",displayName:"Fernanda",locale:"pt-PT"},{name:"sr-Latn-RS-NicholasNeural",gender:"male",displayName:"Nicholas",locale:"sr-Latn-RS"},{name:"sr-Latn-RS-SophieNeural",gender:"female",displayName:"Sophie",locale:"sr-Latn-RS"},{name:"sv-SE-HilleviNeural",gender:"female",displayName:"Hillevi",locale:"sv-SE"},{name:"th-TH-AcharaNeural",gender:"female",displayName:"อัจฉรา",locale:"th-TH"},{name:"wuu-CN-XiaotongNeural",gender:"female",displayName:"晓彤",locale:"wuu-CN"},{name:"wuu-CN-YunzheNeural",gender:"male",displayName:"云哲",locale:"wuu-CN"},{name:"zh-CN-XiaochenNeural",gender:"female",displayName:"晓辰",locale:"zh-CN"},{name:"zh-CN-XiaochenMultilingualNeural",gender:"female",displayName:"晓辰 多语言",locale:"zh-CN"},{name:"zh-CN-XiaohanNeural",gender:"female",displayName:"晓涵",locale:"zh-CN"},{name:"zh-CN-XiaomengNeural",gender:"female",displayName:"晓梦",locale:"zh-CN"},{name:"zh-CN-XiaomoNeural",gender:"female",displayName:"晓墨",locale:"zh-CN"},{name:"zh-CN-XiaoqiuNeural",gender:"female",displayName:"晓秋",locale:"zh-CN"},{name:"zh-CN-XiaorouNeural",gender:"female",displayName:"晓柔",locale:"zh-CN"},{name:"zh-CN-XiaoruiNeural",gender:"female",displayName:"晓睿",locale:"zh-CN"},{name:"zh-CN-XiaoshuangNeural",gender:"female",displayName:"晓双",locale:"zh-CN"},{name:"zh-CN-XiaoxiaoDialectsNeural",gender:"female",displayName:"晓晓 ",locale:"zh-CN"},{name:"zh-CN-XiaoxiaoMultilingualNeural",gender:"female",displayName:"晓晓 多语言",locale:"zh-CN"},{name:"zh-CN-XiaoyanNeural",gender:"female",displayName:"晓颜",locale:"zh-CN"},{name:"zh-CN-XiaoyouNeural",gender:"female",displayName:"晓悠",locale:"zh-CN"},{name:"zh-CN-XiaoyuMultilingualNeural",gender:"female",displayName:"晓宇 多语言",locale:"zh-CN"},{name:"zh-CN-XiaozhenNeural",gender:"female",displayName:"晓甄",locale:"zh-CN"},{name:"zh-CN-YunfengNeural",gender:"male",displayName:"云枫",locale:"zh-CN"},{name:"zh-CN-YunhaoNeural",gender:"male",displayName:"云皓",locale:"zh-CN"},{name:"zh-CN-YunjieNeural",gender:"male",displayName:"云杰",locale:"zh-CN"},{name:"zh-CN-YunxiaoMultilingualNeural",gender:"male",displayName:"云霄 多语言",locale:"zh-CN"},{name:"zh-CN-YunyeNeural",gender:"male",displayName:"云野",locale:"zh-CN"},{name:"zh-CN-YunyiMultilingualNeural",gender:"male",displayName:"云逸 多语言",locale:"zh-CN"},{name:"zh-CN-YunzeNeural",gender:"male",displayName:"云泽",locale:"zh-CN"},{name:"zh-CN-YunfanMultilingualNeural",gender:"male",displayName:"云帆 多语言",locale:"zh-CN"},{name:"zh-CN-guangxi-YunqiNeural",gender:"male",displayName:"云奇 广西",locale:"zh-CN"},{name:"zh-CN-henan-YundengNeural",gender:"male",displayName:"云登 河南",locale:"zh-CN"},{name:"zh-CN-liaoning-YunbiaoNeural",gender:"male",displayName:"云彪 辽宁",locale:"zh-CN"},{name:"zh-CN-shandong-YunxiangNeural",gender:"male",displayName:"云翔 山东",locale:"zh-CN"},{name:"zh-CN-sichuan-YunxiNeural",gender:"male",displayName:"云希 四川",locale:"zh-CN"}],SelfHostedVoiceList:["de-DE-AmalaNeural","de-DE-BerndNeural","de-DE-ConradNeural","de-DE-KatjaNeural","en-GB-LibbyNeural","en-GB-RyanNeural","en-GB-SoniaNeural","en-US-AmberNeural","en-US-AriaNeural","en-US-ChristopherNeural","en-US-DavisNeural","en-US-EricNeural","en-US-GuyNeural","en-US-JaneNeural","en-US-JennyNeural","en-US-MichelleNeural","en-US-SaraNeural","es-ES-AbrilNeural","es-ES-AlvaroNeural","es-ES-ArnauNeural","es-ES-ElviraNeural","fr-FR-DeniseNeural","fr-FR-HenriNeural","it-IT-BenignoNeural","it-IT-DiegoNeural","it-IT-ElsaNeural","it-IT-IsabellaNeural","ja-JP-KeitaNeural","ja-JP-NanamiNeural","ko-KR-InJoonNeural","ko-KR-SoonBokNeural","ko-KR-SunHiNeural","pt-BR-AntonioNeural","pt-BR-FranciscaNeural","pt-PT-DuarteNeural","pt-PT-RaquelNeural","ru-RU-DariyaNeural","ru-RU-DmitryNeural","ru-RU-SvetlanaNeural","yue-CN-XiaoMinNeural","yue-CN-YunSongNeural","zh-CN-henan-YundengNeural","zh-CN-liaoning-XiaobeiNeural","zh-CN-shaanxi-XiaoniNeural","zh-CN-shandong-YunxiangNeural","zh-CN-sichuan-YunxiNeural","zh-CN-XiaoxiaoNeural","zh-CN-YunxiNeural","zh-HK-HiuMaanNeural","zh-HK-WanLungNeural","zh-TW-HsiaoChenNeural","zh-TW-YunJheNeural","zf_xiaoxiao","zm_yunxi","zf_xiaoni","zf_xiaobei"],CloudDictList:[{id:"basic-english-irish",name:"Basic English-Irish Dictionary",translation:"简明英爱词典",source:"Pat Griffin"},{id:"english-italian",name:"English-Italian Dictionary",translation:"简明英意词典",source:"Pat Griffin"},{id:"cc-cedict",name:"CC-CEDICT",translation:"简明中英词典",source:"www.mdbg.net"},{id:"et-tedict",name:"ET-TEDICT",translation:"简明中英英中词典",source:"cdict-1.0-1.i386.rpm"},{id:"jmdict",name:"Japanese English Dictionary",translation:"简明日英词典",source:"JMDict"},{id:"moby",name:"Moby Thesaurus",translation:"Moby Thesaurus",source:"Chua Welic"},{id:"wordnet",name:"Wordnet",translation:"Wordnet",source:"Chua Welic"},{id:"opted",name:"Online Plain Text English Dictionary",translation:"简明英英词典",source:"Chua Welic"},{id:"english-arabic",name:"English-Arabic Dictionary",translation:"简明英阿词典",source:"Khaldoun Mahmoud"},{id:"tcm_textbook",name:"中医教材仓库",translation:"中医教材仓库",source:"Fredrik Jornebo"},{id:"ecdict",name:"ECDICT",translation:"简明英汉字典增强版",source:"GitHub-skywind3000"}]};class x{constructor(e){this.config=e,this.driveId="",this.taskQueue=new k(1),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getDriveId(){return m(this,void 0,void 0,(function*(){if(this.driveId)return this.driveId;const a=this.config.access_token,t=yield e.post("https://openapi.alipan.com/adrive/v1.0/user/getDriveInfo",{},{headers:{Authorization:`Bearer ${a}`}});return this.driveId=t.data.default_drive_id,this.driveId}))}getFolderIdByPath(a){return m(this,void 0,void 0,(function*(){const t=this.config.access_token,o=yield this.getDriveId();try{try{const i=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(i.data)return i.data.file_id}catch(i){const n=a.split("/").filter((e=>e));let r="",l="root";for(const a of n){r+="/"+a;try{l=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:r},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id}catch(i){l=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:o,parent_file_id:l,name:a,type:"folder",check_name_mode:"refuse"},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id}}return l}}catch(e){return console.error("Error getting/creating folder by path:",e),""}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=yield this.getDriveId(),i=yield this.getFolderIdByPath(this.baseFolder+"/"+a);let n=[],r="",l=!0;for(;l;){const a=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/list",{drive_id:o,parent_file_id:i,marker:r||void 0},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}),s=a.data.items.filter((e=>!e.punish_flag||2!==e.punish_flag))||[];n=n.concat(s),r=a.data.next_marker,l=!!r}return[...new Set(n.map((e=>({name:e.name,size:e.size,type:e.type,modified:e.updated_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=yield this.getDriveId(),i=yield this.getFolderIdByPath(this.baseFolder+"/"+a);return!i||(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/delete",{drive_id:o,file_id:i},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}checkExists(a){var t;return m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=yield this.getDriveId(),n=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:i,file_path:a},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}});(null===(t=n.data)||void 0===t?void 0:t.file_id)&&(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/recyclebin/trash",{drive_id:i,file_id:n.data.file_id},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}))}catch(e){}}))}getAuthUrl(e){return`https://openapi.alipan.com/oauth/authorize?${new URLSearchParams({response_type:"code",client_id:C.adriveClientId,redirect_uri:e,grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}).toString()}`}}class I extends x{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=yield this.getDriveId(),n=t.substring(0,t.lastIndexOf("/")),r=t.substring(t.lastIndexOf("/")+1);yield this.deleteFileWithoutQueue(t);const l=yield this.getFolderIdByPath(this.baseFolder+"/"+n),s=yield a.arrayBuffer(),d=s.byteLength,c=yield crypto.subtle.digest("SHA-1",s),u=Array.from(new Uint8Array(c)).map((e=>e.toString(16).padStart(2,"0"))).join(""),m=(e=>{function a(e,a){const t=(65535&e)+(65535&a);return(e>>16)+(a>>16)+(t>>16)<<16|65535&t}function t(e,t,o,i,n,r){return a((l=a(a(t,e),a(i,r)))<<(s=n)|l>>>32-s,o);var l,s}function o(e,a,o,i,n,r,l){return t(a&o|~a&i,e,a,n,r,l)}function i(e,a,o,i,n,r,l){return t(a&i|o&~i,e,a,n,r,l)}function n(e,a,o,i,n,r,l){return t(a^o^i,e,a,n,r,l)}function r(e,a,o,i,n,r,l){return t(o^(a|~i),e,a,n,r,l)}const l=function(e){const a=e.length,t=1+(a+8>>6),o=new Array(16*t).fill(0);for(let t=0;t>2]|=e.charCodeAt(t)<>2]|=128<{let a="";for(let t=0;t<4;t++)a+=("0"+(e>>8*t&255).toString(16)).slice(-2);return a})).join("")})(o),p=Number(BigInt("0x"+m.slice(0,16))%BigInt(d||1)),h=new Uint8Array(s.slice(p,Math.min(p+8,d))),g=btoa(String.fromCharCode(...h)),f=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:i,parent_file_id:l,name:r,type:"file",check_name_mode:"ignore",size:d,content_hash:u,content_hash_name:"sha1",proof_code:g,proof_version:"v1",part_info_list:[{part_number:1}]},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}),{file_id:y,upload_id:N,rapid_upload:v,part_info_list:b}=f.data;return v?(console.info("阿里云盘秒传成功"),!0):(yield fetch(b[0].upload_url,{method:"PUT",body:s,headers:{"Content-Length":d.toString()}}),yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/complete",{drive_id:i,file_id:y,upload_id:N},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=yield this.getDriveId(),i=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:this.baseFolder+"/"+a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id,n=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/getDownloadUrl",{drive_id:o,file_id:i},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return(yield e.get(n.data.url,{responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}})).data}catch(e){return console.error("Error downloading file:",e),!1}}))))))}}class F{constructor(e){this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getFolderIdByPath(a){return m(this,void 0,void 0,(function*(){if(""==a)return"0";const t=this.config.access_token,o=a.split("/");let i="0";for(const a of o){const o=`https://api.box.com/2.0/folders/${i}/items?fields=id,name&type=folder&limit=1000`;try{const n=(yield e.get(o,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===a&&"folder"===e.type));if(n)i=n.id;else{const o={name:a,parent:{id:i},type:"folder"};i=(yield e.post("https://api.box.com/2.0/folders",o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.id}}catch(e){return console.error("Error occurred during folder creation:",e),""}}return i}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);let i=yield this.getFolderIdByPath(o),n=[],r=0,l=!0;const s=1e3;for(;l;){const a=yield e.get(`https://api.box.com/2.0/folders/${i}/items`,{params:{limit:s,offset:r},headers:{Authorization:`Bearer ${t}`}}),o=a.data.entries||[];n=n.concat(o),r+=o.length,l=o.length===s&&a.data.total_count>r}return[...new Set(n.map((e=>({name:e.name,size:e.size||0,type:e.type,modified:e.content_modified_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=a.substring(0,a.lastIndexOf("/")),i=a.substring(a.lastIndexOf("/")+1);let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const r=yield this.getFolderIdByPath(n);if(!r)return!0;const l=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=file&limit=1000`,s=(yield e.get(l,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===i&&"file"===e.type));return!s||(yield e.delete(`https://api.box.com/2.0/files/${s.id}`,{headers:{Authorization:`Bearer ${t}`}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://account.box.com/api/oauth2/authorize?${new URLSearchParams({response_type:"code",client_id:C.boxClientId,redirect_uri:e,grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}).toString()}`}}class R extends F{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=t.substring(0,t.lastIndexOf("/")),n=t.substring(t.lastIndexOf("/")+1);let r=this.baseFolder+"/"+i;for(;r.startsWith("/");)r=r.substring(1);const l=yield this.getFolderIdByPath(r);if(!l)throw new Error("Folder not found");const s=(yield this.listFiles(i)).find((e=>e===n));s&&(yield this.deleteFileWithoutQueue(i+"/"+n));let d=new File([a],n,{lastModified:(new Date).getTime(),type:a.type});const c=new FormData;c.append("file",d),c.append("parent_id",l);const u=yield e.post("https://upload.box.com/api/2.0/files/content",c,{headers:{Authorization:`Bearer ${o}`,"Content-Type":"multipart/form-data"},params:{if_match:"false",fields:"name,id"},maxContentLength:1/0,maxBodyLength:1/0});return!(u.status>=300)||(console.error("Error occurred during file upload:",u),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=a.substring(0,a.lastIndexOf("/")),i=a.substring(a.lastIndexOf("/")+1);let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const r=yield this.getFolderIdByPath(n);if(!r)return console.error("Folder not found"),!0;const l=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=file&limit=1000`,s=(yield e.get(l,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===i&&"file"===e.type));if(!s)return console.error("File not found:",i),!0;const d=yield e({url:`https://api.box.com/2.0/files/${s.id}/content`,method:"get",headers:{Authorization:`Bearer ${t}`},responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return d.status>=300?(console.error("Error occurred during file download:",d),!1):d.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class O{constructor(e){this.config=e,this.taskQueue=new k(3)}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=[],i=!0,n=null;for(;i;){let r;r=n?yield e.post("https://api.dropboxapi.com/2/files/list_folder/continue",{cursor:n},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}):yield e.post("https://api.dropboxapi.com/2/files/list_folder",{path:"/"+a,limit:2e3},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});const l=r.data.entries||[];o=o.concat(l),i=r.data.has_more,n=r.data.cursor}return[...new Set(o.map((e=>({name:e.name,size:e.size||0,type:e[".tag"],modified:e.client_modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;yield e.post("https://api.dropboxapi.com/2/files/delete_v2",{path:"/"+a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://www.dropbox.com/oauth2/authorize?response_type=code&token_access_type=offline&client_id=${C.dropboxClientId}&redirect_uri=${e}`}}class _ extends O{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type});const r=yield e.post("https://content.dropboxapi.com/2/files/upload",n,{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/octet-stream","Dropbox-API-Arg":JSON.stringify({path:"/"+t,mode:"overwrite",autorename:!0,mute:!1})},maxContentLength:1/0,maxBodyLength:1/0});return!(r.status>=300)||(console.error("Error occurred during file upload:",r),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=yield e({url:"https://content.dropboxapi.com/2/files/download",method:"post",headers:{Authorization:`Bearer ${t}`,"Dropbox-API-Arg":JSON.stringify({path:"/"+a})},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return o.status>=300?(console.error("Error occurred during file download:",o),!1):o.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ${constructor(e){this.folderExistsCache=new Set,this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){var t,o;return m(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);let n=[],r=0;const l=1e3;let s=!0;for(;s;){const d=yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:a?`/${a}`:"/",limit:l,offset:r,fields:"_embedded.items.name,_embedded.items.size,_embedded.items.type,_embedded.items.modified,_embedded.total"}}),c=(null===(t=d.data._embedded)||void 0===t?void 0:t.items)||[];n=n.concat(c);const u=(null===(o=d.data._embedded)||void 0===o?void 0:o.total)||0;r+=c.length,s=r({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);const o=yield e.delete("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${t}`,"Content-Type":"application/json"},params:{path:a?`/${a}`:"/",permanently:!1}});return 202===o.status||204===o.status}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(a){var t,o;return m(this,void 0,void 0,(function*(){try{const i=this.config.access_token,n=a.split("/").filter((e=>e.length>0));let r="";for(const a of n)if(r+="/"+a,!this.folderExistsCache.has(r))try{yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:r}}),this.folderExistsCache.add(r)}catch(a){if(404!==(null===(t=a.response)||void 0===t?void 0:t.status))return console.error("Error checking directory:",a),!1;try{yield e.put(`https://cloud-api.yandex.net/v1/disk/resources?path=${encodeURIComponent(r)}`,null,{headers:{Authorization:`OAuth ${i}`}}),this.folderExistsCache.add(r)}catch(e){if(409!==(null===(o=e.response)||void 0===o?void 0:o.status))return console.error("Error creating directory:",e),!1;this.folderExistsCache.add(r)}}return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}getAuthUrl(e){return`https://oauth.yandex.com/authorize?response_type=code&client_id=${C.yandexClientId}&redirect_uri=${e}&force_confirm=true`}}class M extends ${constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=this.baseFolder+"/"+t;for(;i.startsWith("/");)i=i.substring(1);const n=i.substring(0,i.lastIndexOf("/"));if(n){if(!(yield this.ensureDirectoryExists(n)))return console.error("Failed to create directory:",n),!1}const r=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/upload",{headers:{Authorization:`OAuth ${o}`,"Content-Type":"application/json"},params:{path:`/${i}`,overwrite:!0}});if(200!==r.status)return console.error("Error getting upload URL:",r),!1;const l=r.data.href;let s=t.split("/").pop()||"",d=new File([a],s,{lastModified:(new Date).getTime(),type:a.type});const c=yield e.put(l,d,{headers:{"Content-Type":a.type||"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0});return!(c.status>=300)||(console.error("Error occurred during file upload:",c),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);const i=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/download",{headers:{Authorization:`OAuth ${t}`,"Content-Type":"application/json"},params:{path:`/${o}`}});if(200!==i.status)return console.error("Error getting download URL:",i),!1;const n=i.data.href,r=yield e({url:n,method:"get",maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return r.status>=300?(console.error("Error occurred during file download:",r),!1):r.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class U{constructor(e){this.isExp=!1,this.folderIdCache=new Map,this.config=e,this.taskQueue=new k(3),this.isExp=this.config.isExp||!1,this.baseFolder="KoodoReader"}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getFileId(a,t){return m(this,void 0,void 0,(function*(){const o=this.config.access_token,i=`https://www.googleapis.com/drive/v3/files?q=name='${a}'+and+'${t}'+in+parents&fields=files(id,name)`;try{const a=yield e.get(i,{headers:{Authorization:"Bearer "+o}});if(0===a.data.files.length)return"";const t=a.data.files;return t.length>0?t[0].id:null}catch(e){return console.error("Error occurred during file list retrieval:",e),""}}))}checkFolder(a){return m(this,void 0,void 0,(function*(){a=this.baseFolder+"/"+a;const t=this.config.access_token;if(""===a)return"root";if(this.folderIdCache.has(a))return this.folderIdCache.get(a);const o=a.split("/").filter((e=>""!==e.trim()));let i="root",n="";for(const a of o){if(n=n?n+"/"+a:a,this.folderIdCache.has(n)){i=this.folderIdCache.get(n);continue}let o=yield this.getFolderId(a,i);if(!o){const n={name:a,mimeType:"application/vnd.google-apps.folder",parents:[i]};try{o=(yield e.post("https://www.googleapis.com/drive/v3/files",n,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.id}catch(e){throw console.error(`Error occurred during folder creation for ${a}:`,e),e}}this.folderIdCache.set(n,o),i=o}return i}))}getFolderId(a,t){return m(this,void 0,void 0,(function*(){const o=this.config.access_token,i=`https://www.googleapis.com/drive/v3/files?q=name='${a=encodeURIComponent(a)}'+and+mimeType='application/vnd.google-apps.folder'+and+'${t}'+in+parents&fields=files(id,name)`;try{const a=(yield e.get(i,{headers:{Authorization:`Bearer ${o}`}})).data.files;return a.length>0?a[0].id:null}catch(e){throw console.error("Error occurred during fetching folder ID:",e),e}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=yield this.checkFolder(a),i=[],n="",r=!0;for(;r;){let a=`https://www.googleapis.com/drive/v3/files?q='${o}'+in+parents&fields=nextPageToken,files(id,name,size,mimeType)&pageSize=1000`;n&&(a+=`&pageToken=${n}`);const l=yield e.get(a,{headers:{Authorization:`Bearer ${t}`}}),s=l.data.files||[];i=i.concat(s),n=l.data.nextPageToken,r=!!n}return[...new Set(i.map((e=>({name:e.name,size:e.size||0,type:"application/vnd.google-apps.folder"===e.mimeType?"folder":"file",modified:e.modifiedTime}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQue(e)}))))))}))}deleteFileWithoutQue(a){return m(this,void 0,void 0,(function*(){const t=a.split("/").pop()||"",o=a.split("/").slice(0,-1).join("/"),i=yield this.checkFolder(o),n=this.config.access_token,r=yield this.getFileId(t,i);if(""===r)return console.error("File not found:",t),!0;try{const a=yield e.delete(`https://www.googleapis.com/drive/v3/files/${r}`,{headers:{Authorization:`Bearer ${n}`}});return console.error("File deleted:",a),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${e}&prompt=consent&response_type=code&client_id=${C.googleClientId}&scope=https://www.googleapis.com/auth/${this.isExp?"drive":"drive.file"}&access_type=offline`}}class B extends U{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type}),r=t.split(".").pop(),l=p(r||""),s=t.split("/")[0],d=yield this.checkFolder(s),c=yield this.getFileId(i||"",d);const u={mimeType:l,name:i,parents:[d]},m=c?`https://www.googleapis.com/upload/drive/v3/files/${c}?uploadType=resumable`:"https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable",h=(yield e({method:c?"PATCH":"POST",url:m,data:c?null:JSON.stringify(u),headers:{Authorization:"Bearer "+o,"Content-Type":"application/json; charset=UTF-8"},maxContentLength:1/0,maxBodyLength:1/0})).headers.location,g=yield this.getData(n);if(0===Object.keys(g).length)return!1;const f=yield e.put(h,g.data,{headers:{Authorization:"Bearer "+o,"Content-Type":"application/zip","Content-Range":`bytes 0-${g.fileSize-1}/${g.fileSize}`},maxContentLength:1/0,maxBodyLength:1/0});return!(f.status>=300)||(console.error("Error occurred during file download:",f),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=a.split("/").pop(),i=a.split("/")[0],n=yield this.checkFolder(i),r=yield this.getFileId(o||"",n);if(!r)return console.error("File not found:",o),!0;const l=`https://www.googleapis.com/drive/v3/files/${r}?alt=media`,s=yield e.get(l,{headers:{Authorization:"Bearer "+t},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return s.status>=300?(console.error("Error occurred during file download:",s),!1):s.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getData(e){return m(this,void 0,void 0,(function*(){return e?new Promise(((a,t)=>{const o=new FileReader;o.onload=t=>a({fileName:e.name,mimeType:e.type,fileSize:e.size,data:t.target.result}),o.onerror=e=>t(e),o.readAsArrayBuffer(e)})):{}}))}}class z{constructor(e){this.folderCreationLocks=new Map,this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=2){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getStorage(){return m(this,void 0,void 0,(function*(){if(this.storage)return this.storage;let{email:e,password:t}=this.config;return this.storage=yield new a({email:e,password:t,userAgent:"KoodoReader/1.0"}).ready,this.storage}))}getRoot(){return m(this,void 0,void 0,(function*(){if(this.root)return this.root;const e=(yield this.getStorage()).root;if(""===this.baseFolder)return this.root=e,this.root;let a=e.children.find((e=>e.name===this.baseFolder&&e.directory));return a||(a=yield e.mkdir(this.baseFolder)),this.root=a,this.root}))}createFolder(e,a){return m(this,void 0,void 0,(function*(){const t=`${e.nodeId}_${a}`;if(this.folderCreationLocks.has(t))return yield this.folderCreationLocks.get(t);const o=(()=>m(this,void 0,void 0,(function*(){try{let t=e.children.find((e=>e.name===a&&e.directory));return t||(t=yield e.mkdir(a),t)}finally{this.folderCreationLocks.delete(t)}})))();return this.folderCreationLocks.set(t,o),yield o}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){try{let a=yield this.getRoot();if(e){const t=e.split("/").filter((e=>e));for(const e of t){const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return[];a=t}}return a.children.map((e=>({name:e.name,size:e.size||0,type:e.directory?"folder":"file",modified:e.timestamp?new Date(1e3*e.timestamp).toISOString():""})))}catch(e){return console.error("Error listing MEGA files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return m(this,void 0,void 0,(function*(){try{let a=yield this.getRoot();const t=e.split("/"),o=t.pop();for(const e of t){if(!e)continue;const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return!0;a=t}const i=a.children.find((e=>e.name===o&&!e.directory));return!i||(yield i.delete(),!0)}catch(e){return console.error("Error deleting MEGA file:",e),!1}}))}}class D extends z{constructor(e){super(e)}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{let o=yield this.getRoot();const i=a.split("/"),n=i.pop()||"";for(const e of i){if(!e)continue;let a=o.children.find((a=>a.name===e&&a.directory));a||(a=yield this.createFolder(o,e)),o=a}const r=new File([e],n,{lastModified:(new Date).getTime(),type:e.type}),l=yield e.arrayBuffer(),s=new Uint8Array(l),d=t.from(s),c=o.children.find((e=>e.name===n&&!e.directory));return c&&(yield c.delete()),yield o.upload({name:n,size:r.size},d).complete,!0}catch(e){return console.error("Error occurred during MEGA file upload:",e),!1}}))))))}))}downloadFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let a=yield this.getRoot();const t=e.split("/"),o=t.pop()||"";for(const e of t){if(!e)continue;const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return!0;a=t}const i=a.children.find((e=>e.name===o&&!e.directory));if(!i)return!0;const n=yield i.downloadBuffer();return this.taskQueue.setDownloadedSize(n.size),n.buffer}catch(e){return console.error("Error occurred during MEGA file download:",e),!1}}))))))}))}}class L{constructor(e){this.isExp=!1,this.baseUrl="https://graph.microsoft.com/v1.0/me/drive/special/approot",this.config=e,this.taskQueue=new k(3),this.isExp=this.config.isExp||!1,this.baseUrl=this.isExp?"https://graph.microsoft.com/v1.0/me/drive/root":"https://graph.microsoft.com/v1.0/me/drive/special/approot",void 0===this.config.baseFolder?this.baseFolder=this.isExp?"KoodoReader":"":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);let o,i=[];if(""===a)o=`${this.baseUrl}/children`;else{const e=encodeURIComponent(a);o=`${this.baseUrl}:/${e}:/children`}for(;o;){const a=yield e.get(o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(a.status>=300)break;const n=a.data.value||[];i=i.concat(n),o=a.data["@odata.nextLink"]||""}return[...new Set(i.map((e=>({name:e.name,size:e.size||0,type:e.folder?"folder":"file",modified:e.lastModifiedDateTime}))))]}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);const o=yield e.delete(`${this.baseUrl}:/${a}`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return!(o.status>=300)||(console.error("Error deleting file:",o),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${C.microsoftClientId}&scope=${this.isExp?"files.readwrite.all":"files.readwrite.appfolder"} offline_access&response_type=code&redirect_uri=${e}`}}class P extends L{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type}),r=this.baseFolder+"/"+t;for(;r.startsWith("/");)r=r.substring(1);const l=this.baseUrl+":/"+r+":/createUploadSession",s=yield e.post(l,null,{headers:{Authorization:"Bearer "+o,"Content-Type":"application/json"},maxContentLength:1/0,maxBodyLength:1/0});let d=n.size;const c=n.type,u=s.data.uploadUrl,m=yield e.put(u,n,{headers:{"Content-Type":c,"Content-Range":`bytes 0-${d-1}/${d}`},maxContentLength:1/0,maxBodyLength:1/0});return!(m.status>=300)||(console.error("Error occurred during file download:",m),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);const i=`${this.baseUrl}:/${o}:/content`,n=yield e.get(i,{responseType:"arraybuffer",headers:{Authorization:"Bearer "+t},maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error occurred during file download:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class j{downloadFile(e,a){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}listFiles(e){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e([])}))}))}getAuthUrl(){return""}}class K{constructor(e){this.baseUrl="https://api.pcloud.com",this.config=e,this.taskQueue=new k(3),this.baseUrl="2"===e.region?"https://eapi.pcloud.com":"https://api.pcloud.com"}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}checkFolderExists(a,t){return m(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:t,path:`/${a}`}})).data.result}catch(e){return console.error("Error checking folder:",e),!1}}))}createFolder(a,t){return m(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/createfolderifnotexists`,{params:{access_token:t,path:`/${a}`}})).data.result}catch(e){return console.error("Error creating folder:",e),!1}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:t,path:"/"+a,recursive:0}});return 0!==o.data.result?[]:o.data.metadata.contents.map((e=>({name:e.name,size:e.size||0,type:e.isfolder?"folder":"file",modified:e.modified})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/deletefile`,{params:{access_token:t,path:"/"+a}});return 0===o.data.result||(console.error("Error deleting file:",o.data),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://my.pcloud.com/oauth2/authorize?client_id=${C.pcloudClientId}&response_type=code&redirect_uri=${e}`}}class H extends K{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.refresh_token,i=t.split("/").slice(0,-1).join("/");if(!(yield this.checkFolderExists(i,o))){if(!(yield this.createFolder(i,o)))return!1}let n=t.split("/").pop()||"",r=new File([a],n,{lastModified:(new Date).getTime(),type:a.type});const l=new FormData;l.append("file",r);const s=yield e.post(`${this.baseUrl}/uploadfile`,l,{params:{access_token:o,path:`/${i}`,renew:1},maxContentLength:1/0,maxBodyLength:1/0});return 0===s.data.result||(console.error("Error uploading file:",s.data),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/getfilelink`,{params:{access_token:t,path:`/${a}`}});if(0!==o.data.result)return console.error("Error getting file link:",o.data),!0;const i=`https://${o.data.hosts[0]}${o.data.path}`,n=yield e.get(i,{responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error downloading file:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class J{constructor(e){this.config=e,this.taskQueue=new k(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=0){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}shouldUsePathStyle(){try{if(this.config.forcePathStyle&&"no"!==this.config.forcePathStyle)return!0;let e=this.config.endpoint;const a=new URL(e),t=a.hostname,o=/^(\d{1,3}\.){3}\d{1,3}$/.test(t),i=""!==a.port;return!o&&i}catch(e){return!0}}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){let{endpoint:a,region:t,bucketName:n,accessKeyId:r,secretAccessKey:l,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;let d=s+"/"+e;for(;d.startsWith("/");)d=d.substring(1);""===d||d.endsWith("/")||(d+="/");const c=new o({endpoint:a,region:t,credentials:{accessKeyId:r,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});try{let e,a=[],t=[],o=!0;for(;o;){const r=yield c.send(new i({Bucket:n,Prefix:d,Delimiter:"/",ContinuationToken:e}));r.Contents&&(a=a.concat(r.Contents)),r.CommonPrefixes&&(t=t.concat(r.CommonPrefixes)),e=r.NextContinuationToken,o=!!e}let r=[];return a.forEach((e=>{if(!e.Key.endsWith("/")){const a=e.Key.substring(d.length);a.includes("/")||r.push({name:a,size:e.Size||0,type:"file",modified:e.LastModified?e.LastModified.toISOString():""})}})),t.forEach((e=>{const a=e.Prefix.substring(d.length).replace(/\/$/,"");a&&r.push({name:a,size:0,type:"folder",modified:""})})),r}catch(e){return console.error(e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){let{endpoint:a,region:t,bucketName:i,accessKeyId:r,secretAccessKey:l,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;const d=new o({endpoint:a,region:t,credentials:{accessKeyId:r,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});let c=s+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{return yield d.send(new n({Bucket:i,Key:c})),!0}catch(e){return console.error(e),!1}}))}}class W extends J{constructor(e){super(e)}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:n,accessKeyId:l,secretAccessKey:s,dir:d}=this.config;const c=new o({endpoint:t,region:i,credentials:{accessKeyId:l,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});d=d&&"KoodoReader"===this.baseFolder?d:this.baseFolder;let u=d+"/"+a;for(;u.startsWith("/");)u=u.substring(1);try{let a=yield c.send(new r({Bucket:n,Key:u,Body:e}));return 200===a.$metadata.httpStatusCode||(console.error("Error uploading file:",a),!1)}catch(e){return console.error("Error: ",e),!1}}))))))}))}downloadFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let{endpoint:a,region:t,bucketName:i,accessKeyId:n,secretAccessKey:r,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;const d=new o({endpoint:a,region:t,credentials:{accessKeyId:n,secretAccessKey:r},forcePathStyle:this.shouldUsePathStyle()});let c=s+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{const e=yield d.send(new l({Bucket:i,Key:c}));if(!e.Body)return console.error("No response body"),!1;const a=yield e.Body.transformToByteArray();return this.taskQueue.setDownloadedSize(a.length),a.buffer}catch(a){return console.error("Error downloading file:",a,e),!1}}))))))}))}}class q{constructor(e){this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder;a&&""!==a.trim()&&(o=o+"/"+a),o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));let i=[],n=0;const r=1e3;for(;;){const a=yield e.get("https://pan.baidu.com/rest/2.0/xpan/file",{params:{method:"list",access_token:t,dir:"/"+o,start:n,limit:r,order:"name",desc:0,web:1,folder:0},headers:{"User-Agent":"pan.baidu.com"}});if(a.status>=300||0!==a.data.errno){console.error("百度网盘API错误:",a.data);break}const l=a.data.list||[];if(0===l.length)break;if(i=i.concat(l),l.length({name:e.server_filename,size:e.size||0,type:e.isdir?"folder":"file",modified:new Date(1e3*e.server_mtime).toISOString(),path:e.path,fs_id:e.fs_id})))}catch(e){return console.error("获取百度网盘文件列表时发生错误:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));const i=new URLSearchParams({async:"0",filelist:JSON.stringify(["/"+o])}),n=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=filemanager&access_token=${t}&opera=delete`,i.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==n.data.errno)return console.error("百度网盘删除文件API错误:",n.data),-9===n.data.errno?console.error("文件不存在"):111===n.data.errno?console.error("有其他异步任务正在执行"):-7===n.data.errno&&console.error("文件名非法"),!1;const r=n.data.info||[];for(const e of r)if(0!==e.errno)return console.error(`文件删除失败: ${e.path}, 错误码: ${e.errno}`),!1;return!0}catch(e){return console.error("删除文件时发生错误:",e),!1}}))}getAuthUrl(e){return`https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=${C.duboxClientId}&redirect_uri=${e}&scope=basic,netdisk&device_id=119827642&display=page&qrcode=1`}}const G=4194304;class Q extends q{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var o;try{const o=this.config.access_token;let i=this.baseFolder+"/"+t;i=i.replace(/\/+/g,"/"),i.startsWith("/")&&(i=i.substring(1));const n=yield a.arrayBuffer(),r=n.byteLength,l=new Uint8Array(n),{contentMd5:s,sliceMd5:d,blockList:c}=this.calculateFileMd5(l,r),u=new URLSearchParams({path:"/"+i,size:r.toString(),isdir:"0",autoinit:"1",rtype:"3",block_list:JSON.stringify(c),"content-md5":s,"slice-md5":d,local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),m=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=${o}`,u.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==m.data.errno)return console.error("预上传失败:",m.data),!1;const p=m.data.uploadid,h=m.data.block_list||[];if(0===h.length)return!0;const g=yield this.getUploadDomain(o,"/"+i,p);if(!g)return console.error("获取上传域名失败"),!1;for(const a of h){const t=a*G,n=Math.min(G,r-t),s=l.slice(t,t+n),d=new FormData;d.append("file",new Blob([s],{type:"application/octet-stream"}),`chunk_${a}`);const u=`${g}/rest/2.0/pcs/superfile2?method=upload&access_token=${o}&type=tmpfile&path=${encodeURIComponent("/"+i)}&uploadid=${p}&partseq=${a}`,m=yield e.post(u,d,{headers:{"User-Agent":"pan.baidu.com"},maxContentLength:1/0,maxBodyLength:1/0,timeout:0});if(m.status>=300)throw new Error(`分片上传失败: ${JSON.stringify(m.data)}`);const h=m.data.md5,f=c[a];h&&h!==f&&console.warn(`分片 ${a} MD5不匹配: 期望 ${f}, 实际 ${h}`)}const f=new URLSearchParams({path:"/"+i,size:r.toString(),isdir:"0",block_list:JSON.stringify(c),uploadid:p,rtype:"3",local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),y=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${o}`,f.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});return 0===y.data.errno||(console.error("创建文件失败:",y.data),!1)}catch(e){return console.error("文件上传过程中发生错误:",(null===(o=e.response)||void 0===o?void 0:o.data)||e.message||e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var t;this.taskQueue.setDownloadedSize(0);try{const o=this.config.access_token;let i=this.baseFolder+"/"+a;i=i.replace(/\/+/g,"/"),i.startsWith("/")&&(i=i.substring(1));const n=yield this.listFileInfos(a.substring(0,a.lastIndexOf("/"))),r=i.split("/").pop(),l=n.find((e=>e.name===r));if(!l)return console.error("文件不存在:",a),!1;const s=yield e.get("https://pan.baidu.com/rest/2.0/xpan/multimedia",{params:{method:"filemetas",access_token:o,fsids:JSON.stringify([l.fs_id]),dlink:1},headers:{"User-Agent":"pan.baidu.com"}});if(0!==s.data.errno||!(null===(t=s.data.list)||void 0===t?void 0:t[0]))return console.error("获取下载链接失败:",s.data),!1;const d=s.data.list[0].dlink;return(yield e.get(d,{responseType:"arraybuffer",params:{access_token:o},headers:{"User-Agent":"pan.baidu.com"},onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}})).data}catch(e){return console.error("下载文件时发生错误:",e),!1}}))))))}))}getUploadDomain(a,t,o){return m(this,void 0,void 0,(function*(){try{const i=yield e.get("https://d.pcs.baidu.com/rest/2.0/pcs/file",{params:{method:"locateupload",appid:"250528",access_token:a,path:t,uploadid:o,upload_version:"2.0"},headers:{"User-Agent":"pan.baidu.com"}});if(0!==i.data.error_code)return console.error("获取上传域名失败:",i.data),null;const n=i.data.servers||[],r=n.find((e=>e.server.startsWith("https://")));return r?r.server:n.length>0?n[0].server:(console.error("没有可用的上传服务器"),null)}catch(e){return console.error("获取上传域名时出错:",e),null}}))}calculateFileMd5(e,a){const t=[];let o="",i=0;for(;i=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getUploadCredentials(a){return m(this,void 0,void 0,(function*(){try{const t=yield e.get(`${this.baseUrl}/open/upload/get_token`,{headers:{Authorization:`Bearer ${a}`}});return t.status>=300||!t.data.state?(console.error("Error getting upload credentials:",t.data),null):t.data.data}catch(e){return console.error("Error occurred during get upload credentials:",e),null}}))}generateOSSPolicy(e,a,t=new Date(Date.now()+36e5)){const o={expiration:t.toISOString(),conditions:[{bucket:e},{key:a},["starts-with","$success_action_status","2"],["content-length-range",0,1073741824]]};return JSON.stringify(o)}getAuthUrl(e){return`https://passportapi.115.com/open/authorize?client_id=${C.yiyiwuClientId}&response_type=code&redirect_uri=${e}`}}class X extends Y{constructor(e){super(e)}sha1Hex(e){return m(this,void 0,void 0,(function*(){const a=yield crypto.subtle.digest("SHA-1",e);return Array.from(new Uint8Array(a)).map((e=>e.toString(16).padStart(2,"0"))).join("")}))}calculateFileSha1(e){return m(this,void 0,void 0,(function*(){try{const a=yield e.arrayBuffer();return this.sha1Hex(a)}catch(e){return console.error("Error calculating file SHA1:",e),""}}))}calculatePreSha1(e){return m(this,void 0,void 0,(function*(){try{const a=e.slice(0,131072),t=yield a.arrayBuffer();return this.sha1Hex(t)}catch(e){return console.error("Error calculating pre SHA1:",e),""}}))}calculateOSSSignature(e,a){const t=s.enc.Base64.stringify(s.enc.Utf8.parse(a));return s.HmacSHA1(t,e).toString(s.enc.Base64)}handleSecondAuth(e,a,t,o,i,n,r,l){return m(this,void 0,void 0,(function*(){try{if(!a.sign_check)return console.error("No sign_check provided for second authentication"),null;const[s,d]=a.sign_check.split("-"),c=parseInt(s),u=parseInt(d),m=t.slice(c,u+1),p=yield m.arrayBuffer(),h=(yield this.sha1Hex(p)).toUpperCase();return yield this.initializeUpload(e,o,i,n,r,l,a.sign_key,h,a.pick_code)}catch(e){return console.error("Error during second authentication:",e),null}}))}uploadToObjectStorage(a,t,o,i){var n;return m(this,void 0,void 0,(function*(){try{const n=i.endpoint,r=o.bucket,l=o.object;let s;if(n.includes(r))s=n;else{s=`https://${r}.${n.replace(/^https?:\/\//,"")}`}const d=this.generateOSSPolicy(r,l),c=this.calculateOSSSignature(i.AccessKeySecret,d),u=btoa(d),m=new FormData;if(m.append("key",l),m.append("policy",u),m.append("OSSAccessKeyId",i.AccessKeyId),m.append("signature",c),m.append("x-oss-security-token",i.SecurityToken),m.append("success_action_status","200"),o.callback&&o.callback.callback){const e=btoa(o.callback.callback);if(m.append("callback",e),o.callback.callback_var){const e=JSON.parse(o.callback.callback_var);for(const[a,t]of Object.entries(e))m.append(a,String(t))}}const p=new File([a],t,{type:a.type});m.append("file",p);const h=yield e.post(s,m,{maxContentLength:1/0,maxBodyLength:1/0});return 200===h.status||204===h.status||(console.error("Upload failed with status:",h.status),!1)}catch(e){return console.error("Error uploading file via REST API:",(null===(n=e.response)||void 0===n?void 0:n.data)||e.message||e),!1}}))}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var t;try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;o.startsWith("/")||(o="/"+o);const i=e.size,n=yield this.calculateFileSha1(e),r=yield this.calculatePreSha1(e),l=a.split("/").pop()||a,s=o.substring(0,o.lastIndexOf("/"))||"/";let d=yield this.getFolderInfo(s,!0),c="0";if(d)c=d.file_id;else{let e=yield this.createFolder(s);if(!e)return console.error("Failed to create folder:",s),!1;c=e}yield this.deleteFileWithoutQueue(a);let u=yield this.initializeUpload(c,l,i,n,r,t);if(!u)return console.error("Failed to initialize upload"),!1;if((6===u.status||7===u.status||8===u.status)&&(u=yield this.handleSecondAuth(c,u,e,l,i,n,r,t),!u))return console.error("Second authentication failed"),!1;if(2===u.status)return console.info(`File ${a} uploaded successfully via instant upload.`),!0;const m=yield this.getUploadCredentials(t);if(!m)return console.error("Failed to get upload credentials"),!1;return(yield this.uploadToObjectStorage(e,l,u,m))?(console.info(`File ${a} uploaded successfully.`),!0):(console.error("Failed to upload to object storage"),!1)}catch(e){return console.error("Error occurred during file upload:",(null===(t=e.response)||void 0===t?void 0:t.data)||e.message||e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let t=this.baseFolder+"/"+a;t=t.replace(/\/+/g,"/"),t.startsWith("/")||(t="/"+t);const o=yield this.getFolderInfo(t,!1);if(!o||!o.pick_code)return console.error("Failed to get file info or pick_code for:",a),!1;const i=yield this.getFileDownloadUrl(o.pick_code);if(!i)return console.error("Failed to get download URL for:",a),!1;const n=yield e.get(i.url,{responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error downloading file:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}initializeUpload(a,t,o,i,n,r,l,s,d){return m(this,void 0,void 0,(function*(){try{const c=new FormData;c.append("file_name",t),c.append("file_size",o.toString()),a?c.append("target","U_1_"+a):c.append("target","U_1_0"),c.append("fileid",i),c.append("preid",n),c.append("topupload","0"),d&&c.append("pick_code",d),l&&c.append("sign_key",l),s&&c.append("sign_val",s);const u=yield e.post(`${this.baseUrl}/open/upload/init`,c,{headers:{Authorization:`Bearer ${r}`,"Content-Type":"multipart/form-data"}});return u.status>=300||!u.data.state?(console.error("Error initializing upload:",u.data),null):u.data.data}catch(e){return console.error("Error occurred during upload initialization:",e),null}}))}createFolder(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=a.replace(/^\/+|\/+$/g,"");if(!o)return"";const i=o.split("/");let n="",r="0";for(const a of i){n=n?`${n}/${a}`:a;const o=yield this.getFolderInfo(n,!0);if(o&&o.file_id)r=o.file_id;else{const o=new FormData;o.append("pid",r),o.append("file_name",a);const i=yield e.post(`${this.baseUrl}/open/folder/add`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});if(i.status>=300||!i.data.state)return console.error("Error creating folder:",i.data),"";r=i.data.data.file_id}}return r}catch(e){return console.error("Error occurred during folder creation:",e),""}}))}getFolderInfo(a,t){return m(this,void 0,void 0,(function*(){if(""===a||"/"===a)return{file_id:"0"};a.startsWith("/")||(a="/"+a);try{const t=this.config.access_token,o=new FormData;o.append("path",a);const i=yield e.post(`${this.baseUrl}/open/folder/get_info`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});return i.status>=300||!i.data.state||0===i.data.data.length?(console.error("Error getting file info:",i.data),null):i.data.data}catch(e){return console.error("Error occurred during get file info:",e),null}}))}getFileDownloadUrl(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=new FormData;o.append("pick_code",a);const i=yield e.post(`${this.baseUrl}/open/ufile/downurl`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});if(i.status>=300)return console.error("Error getting download URL:",i.data),null;const n=i.data.data,r=Object.keys(n)[0];return r&&n[r]?n[r].url:(console.error("No file data found in download URL response"),null)}catch(e){return console.error("Error occurred during get download URL:",e.message||e),null}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;(a=this.baseFolder+"/"+a).startsWith("/")||(a="/"+a);let o=[],i=0;const n=1150;let r=!0,l=yield this.getFolderInfo(a,!0),s="";if(l)s=l.file_id;else{let e=yield this.createFolder(a);if(!e)return console.error("Failed to create folder:",a),[];s=e}if(!s)return console.error("Failed to get or create folder ID:",a),[];let d=s;for(;r;){const a={offset:i,limit:n,cur:1,show_dir:1};d&&(a.cid=d);const l=yield e.get(`${this.baseUrl}/open/ufile/files`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},params:a});if(l.status>=300)break;const s=l.data.data||[];o=o.concat(s),s.length({name:e.fn,size:e.fs||0,type:"0"===e.fc?"folder":"file",modified:new Date(1e3*e.upt).toISOString()})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;a=this.baseFolder+"/"+a;const o=yield this.getFolderInfo(a,!1);if(!o)return!0;const i=new FormData;i.append("file_ids",o.file_id);const n=yield e.post(`${this.baseUrl}/open/ufile/delete`,i,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});return!(n.status>=300||!n.data.state)||(console.error("Error deleting file:",n),!1)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}}class V{constructor(e){let{username:a,password:t,url:o,dir:i,AuthType:n,createClient:r}=e;void 0===e.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=e.baseFolder,i=i&&"KoodoReader"===this.baseFolder?i:this.baseFolder,this.username=a,this.password=t,this.url=o,this.dir=i,this.taskQueue=new k(5),this.AuthType=n,this.createClient=r}getClient(){return m(this,void 0,void 0,(function*(){return this.webdavClient||(this.url=yield this.handleUrlRedirection(this.url),this.webdavClient=this.createClient(this.url,{authType:this.AuthType.Password,username:this.username,password:this.password})),this.webdavClient}))}handleUrlRedirection(a){return m(this,void 0,void 0,(function*(){try{const t=yield e.head(a,{maxRedirects:0,validateStatus:()=>!0,timeout:5e3});return t.request&&t.request.responseURL&&t.request.responseURL!==a?t.request.responseURL:t.status>=300&&t.status<400&&t.headers.location?t.headers.location:a}catch(e){return console.info("Error handling URL redirection:",e),a}}))}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){const a=yield this.getClient();try{const t=a.getDirectoryContents(this.dir+"/"+e),o=new Promise(((e,a)=>{setTimeout((()=>a(new Error("WebDAV list directory timeout"))),5e3)}));return(yield Promise.race([t,o])).filter((a=>"."!==a.filename&&".."!==a.filename&&a.filename!==e)).map((e=>({name:e.basename,size:e.size||0,type:"directory"===e.type?"folder":"file",modified:e.lastmod})))}catch(t){return t.response&&404===t.response.status&&(yield a.createDirectory(this.dir+"/"+e)),console.error("Error listing files:",t),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){const a=yield this.getClient();try{return yield a.deleteFile(this.dir+"/"+e),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(e){return m(this,void 0,void 0,(function*(){let a=yield this.getClient();try{const t=e.replace(/^\/+|\/+$/g,"").split("/").filter((e=>e.length>0));let o="";for(const e of t)o=o?`${o}/${e}`:e,(yield a.exists(`/${o}`))||(yield a.createDirectory(`/${o}`));return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}}class Z extends V{constructor(e){super(Object.assign(Object.assign({},e),{AuthType:d,createClient:c}))}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{let o=this.dir+"/"+t,i=yield this.getClient();const n=i.exists(o.substring(0,o.lastIndexOf("/"))),r=new Promise(((e,a)=>{setTimeout((()=>a(new Error("WebDAV exists check timeout"))),5e3)}));!1===(yield Promise.race([n,r]))&&(yield this.ensureDirectoryExists(o.substring(0,o.lastIndexOf("/"))));let l=t.split("/").pop()||"",s=new File([a],l,{lastModified:(new Date).getTime(),type:a.type}),d=i.getFileUploadLink(this.dir+"/"+t);const c=new URL(d);c.search="",d=c.toString();const u=btoa(this.username+":"+this.password),m=yield e.put(d,s,{headers:{Authorization:"Basic "+u},maxContentLength:1/0,maxBodyLength:1/0});return!(m.status>=300)||(console.error("Error occurred during file upload:",m),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){if(this.taskQueue.setDownloadedSize(0),-1===a.indexOf("."))return new ArrayBuffer(0);try{const t=btoa(this.username+":"+this.password);let o=this.url.endsWith("/")?this.url:this.url+"/",i=this.dir.startsWith("/")?this.dir.substring(1):this.dir;const n=yield e({url:o+i+"/"+a,method:"get",headers:{Authorization:"Basic "+t},responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error occurred during file download:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ee{constructor(e){this.username=e.username,this.password=e.password,this.url=e.url,this.taskQueue=new k(3)}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{return(yield e.get(`${this.url}/list`,{params:{dir:a},auth:{username:this.username,password:this.password}})).data.files.map((e=>({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modifiedTime})))||[]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{return(yield e.delete(`${this.url}/delete`,{params:{dir:a.split("/").slice(0,-1).join("/")||"",filename:a.split("/").pop()},auth:{username:this.username,password:this.password}})).data.success}catch(e){return console.error("Error deleting file:",e),!1}}))}}class ae extends ee{constructor(e){super(e)}getAuthHeader(){return`Basic ${btoa(`${this.username}:${this.password}`)}`}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=t.split("/").pop()||"",i=t.substring(0,t.lastIndexOf("/"))||"";let n=this.listFiles("");const r=new Promise(((e,a)=>{setTimeout((()=>a(new Error("Docker connection timeout"))),5e3)}));yield Promise.race([n,r]);let l=new File([a],o,{lastModified:(new Date).getTime(),type:a.type});const s=new FormData;s.append("file",l);const d=yield e.post(`${this.url}/upload?dir=${encodeURIComponent(i)}`,s,{headers:{Authorization:this.getAuthHeader(),"Content-Type":"multipart/form-data"},maxContentLength:1/0,maxBodyLength:1/0});return!(d.status>=300)||(console.error("Error occurred during file upload:",d),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=a.split("/").pop()||"",o=a.substring(0,a.lastIndexOf("/"))||"",i=yield e({url:`${this.url}/download`,method:"GET",params:{dir:o,filename:t},headers:{Authorization:this.getAuthHeader()},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return i.status>=300?(console.error("Error occurred during file download:",i),!1):i.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}const te=["book","config","cover","font"];class oe{constructor(e,a){this.type=e,this.remote="dropbox"===e?new _(a):"microsoft"===e?new P(a):"google"===e?new B(a):"microsoft_exp"===e?new P(Object.assign(Object.assign({},a),{isExp:!0})):"google_exp"===e?new B(Object.assign(Object.assign({},a),{isExp:!0})):"s3compatible"===e?new W(a):"webdav"===e?new Z(a):"docker"===e?new ae(a):"boxnet"===e?new R(a):"mega"===e?new D(a):"adrive"===e?new I(a):"pcloud"===e?new H(a):"dubox"===e?new Q(a):"yandex"===e?new M(a):"yiyiwu"===e?new X(a):new j}downloadFile(e,a){return m(this,void 0,void 0,(function*(){if("cover"!==a){if(!(yield this.listFiles(a)).find((a=>e.indexOf(a)>-1)))return!1}return yield this.remote.downloadFile(a+"/"+e)}))}uploadFile(e,a,t){return m(this,void 0,void 0,(function*(){return 0===t.size||(yield this.remote.uploadFile(t,a+"/"+e))}))}deleteFile(e,a){return m(this,void 0,void 0,(function*(){return!(yield this.listFiles(a)).find((a=>e.indexOf(a)>-1))||(yield this.remote.deleteFile(a+"/"+e))}))}listFiles(e){return m(this,void 0,void 0,(function*(){return yield this.remote.listFiles(e)}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){return yield this.remote.listFileInfos(e)}))}isExist(e,a){return m(this,void 0,void 0,(function*(){return(yield this.listFiles(a)).find((a=>-1!==a.indexOf(e)))}))}downloadAllFiles(){return m(this,void 0,void 0,(function*(){for(let e of te){let a=yield this.listFiles(e);for(let t of a)yield this.downloadFile(t,e)}}))}getAuthUrl(e){return this.remote.getAuthUrl?this.remote.getAuthUrl(e):""}getStats(){return this.remote.taskQueue.getStats()}clearQueue(){return this.remote.taskQueue.clearQueue()}resetCounters(){this.remote.taskQueue.resetCounters()}getDownloadedSize(){return this.remote.taskQueue.getDownloadedSize()}}const ie={words:['ALTER TABLE words ADD COLUMN "sentence" text']},ne={notes:"SELECT * FROM notes WHERE key = ?",bookmarks:"SELECT * FROM bookmarks WHERE key = ?",books:"SELECT * FROM books WHERE key = ?",plugins:"SELECT * FROM plugins WHERE key = ?",words:"SELECT * FROM words WHERE key = ?"},re={notes:"SELECT * FROM notes WHERE bookKey = ?",bookmarks:"SELECT * FROM bookmarks WHERE bookKey = ?",words:"SELECT * FROM words WHERE bookKey = ?",books:"SELECT * FROM books WHERE key = ?"},le={notes:"DELETE FROM notes WHERE bookKey = ?",bookmarks:"DELETE FROM bookmarks WHERE bookKey = ?",words:"DELETE FROM words WHERE bookKey = ?"};function se(e){for(const a in e)e.hasOwnProperty(a)&&(e[`temp-${a}`]=e[a]);return e}const de={notes:e=>{let a=Object.assign({},e);return a.date=JSON.parse(e.date),a.tag=JSON.parse(e.tag),a},bookmarks:e=>e,books:e=>e,plugins:e=>{let a=Object.assign({},e);return e.autoValue||delete a.autoValue,e.langList?a.langList=JSON.parse(e.langList):delete a.langList,e.voiceList?a.voiceList=JSON.parse(e.voiceList):delete a.voiceList,a.config=JSON.parse(e.config),a},words:e=>{let a=Object.assign({},e);return a.date=JSON.parse(e.date),void 0===a.sentence&&(a.sentence=""),a}};var ce={sqlStatement:{createTableStatement:se({notes:'\n CREATE TABLE IF NOT EXISTS "notes" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "chapter" text,\n "chapterIndex" integer,\n "text" text,\n "cfi" text,\n "range" text,\n "notes" text,\n "percentage" text,\n "color" integer,\n "tag" array\n )\n ',bookmarks:'\n CREATE TABLE IF NOT EXISTS "bookmarks" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "cfi" text,\n "label" text,\n "percentage" text,\n "chapter" text\n );\n ',books:'\n CREATE TABLE IF NOT EXISTS "books" (\n "key" text PRIMARY KEY,\n "name" text,\n "author" text,\n "description" text,\n "md5" text,\n "cover" text,\n "format" text,\n "publisher" text,\n "size" integer,\n "page" integer,\n "path" text,\n "charset" text\n );\n ',plugins:'\n CREATE TABLE IF NOT EXISTS "plugins" (\n "key" text PRIMARY KEY,\n "type" text,\n "displayName" text,\n "icon" text,\n "version" text,\n "config" object,\n "autoValue" string,\n "langList" text,\n "voiceList" text,\n "scriptSHA256" text,\n "script" text\n );\n ',words:'\n CREATE TABLE IF NOT EXISTS "words" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "word" text,\n "sentence" text,\n "chapter" text\n );\n '}),migrateStatement:se(ie),getAllStatement:se({notes:"SELECT * FROM notes",bookmarks:"SELECT * FROM bookmarks",books:"SELECT * FROM books",plugins:"SELECT * FROM plugins",words:"SELECT * FROM words"}),getPagedStatement:se({notes:"SELECT * FROM notes LIMIT ? OFFSET ?",bookmarks:"SELECT * FROM bookmarks LIMIT ? OFFSET ?",books:"SELECT * FROM books LIMIT ? OFFSET ?",plugins:"SELECT * FROM plugins LIMIT ? OFFSET ?",words:"SELECT * FROM words LIMIT ? OFFSET ?"}),getCountStatement:se({notes:"SELECT COUNT(*) as count FROM notes",bookmarks:"SELECT COUNT(*) as count FROM bookmarks",books:"SELECT COUNT(*) as count FROM books",plugins:"SELECT COUNT(*) as count FROM plugins",words:"SELECT COUNT(*) as count FROM words"}),saveStatement:se({notes:"INSERT OR REPLACE INTO notes (key, bookKey, chapter, chapterIndex, text, cfi, range, notes, date, percentage, color, tag) VALUES (@key, @bookKey, @chapter, @chapterIndex, @text, @cfi, @range, @notes, @date, @percentage, @color, @tag)",bookmarks:"INSERT OR REPLACE INTO bookmarks (key, bookKey, cfi, label, percentage, chapter) VALUES (@key, @bookKey, @cfi, @label, @percentage, @chapter)",books:"INSERT OR REPLACE INTO books (key, name, author, description, md5, cover, format, publisher, size, page, path, charset) VALUES (@key, @name, @author, @description, @md5, @cover, @format, @publisher, @size, @page, @path, @charset)",plugins:"INSERT OR REPLACE INTO plugins (key, type, displayName, icon, version, config, autoValue, langList, voiceList, scriptSHA256, script) VALUES (@key, @type, @displayName, @icon, @version, @config, @autoValue, @langList, @voiceList, @scriptSHA256, @script)",words:"INSERT OR REPLACE INTO words (key, bookKey, date, word, sentence, chapter) VALUES (@key, @bookKey, @date, @word, @sentence, @chapter)"}),deleteAllStatement:se({notes:"DELETE FROM notes",bookmarks:"DELETE FROM bookmarks",books:"DELETE FROM books",plugins:"DELETE FROM plugins",words:"DELETE FROM words"}),updateStatement:se({notes:"UPDATE notes SET bookKey = @bookKey, chapter = @chapter, chapterIndex = @chapterIndex, text = @text, cfi = @cfi, range = @range, notes = @notes, date = @date, percentage = @percentage, color = @color, tag = @tag WHERE key = @key",bookmarks:"UPDATE bookmarks SET bookKey = @bookKey, cfi = @cfi, label = @label, percentage = @percentage, chapter = @chapter WHERE key = @key",books:"UPDATE books SET name = @name, author = @author, description = @description, md5 = @md5, cover = @cover, format = @format, publisher = @publisher, size = @size, page = @page, path = @path, charset = @charset WHERE key = @key",plugins:"UPDATE plugins SET type = @type, displayName = @displayName, icon = @icon, version = @version, config = @config, autoValue = @autoValue, langList = @langList, voiceList = @voiceList, scriptSHA256 = @scriptSHA256, script = @script WHERE key = @key",words:"UPDATE words SET bookKey = @bookKey, date = @date, word = @word, sentence = @sentence, chapter = @chapter WHERE key = @key"}),deleteStatement:se({notes:"DELETE FROM notes WHERE key = ?",bookmarks:"DELETE FROM bookmarks WHERE key = ?",books:"DELETE FROM books WHERE key = ?",plugins:"DELETE FROM plugins WHERE key = ?",words:"DELETE FROM words WHERE key = ?"}),dropStatement:se({notes:"DROP TABLE IF EXISTS notes",bookmarks:"DROP TABLE IF EXISTS bookmarks",books:"DROP TABLE IF EXISTS books",plugins:"DROP TABLE IF EXISTS plugins",words:"DROP TABLE IF EXISTS words"}),getStatement:se(ne),getByBookKeyStatement:se(re),getByBookKeysStatement:se({notes:e=>`SELECT * FROM notes WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,bookmarks:e=>`SELECT * FROM bookmarks WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,words:e=>`SELECT * FROM words WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")})`}),getKeysStatement:se({notes:"SELECT key FROM notes",bookmarks:"SELECT key FROM bookmarks",books:"SELECT key FROM books",plugins:"SELECT key FROM plugins",words:"SELECT key FROM words"}),getWithSortAndPageStatement:se({notes:(e,a,t,o)=>`SELECT * FROM notes ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,bookmarks:(e,a,t,o)=>`SELECT * FROM bookmarks ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,books:(e,a,t,o)=>`SELECT * FROM books ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,plugins:(e,a,t,o)=>`SELECT * FROM plugins ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,words:(e,a,t,o)=>`SELECT * FROM words ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`}),getByKeysStatement:se({notes:e=>`SELECT * FROM notes WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,bookmarks:e=>`SELECT * FROM bookmarks WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,plugins:e=>`SELECT * FROM plugins WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,words:e=>`SELECT * FROM words WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`}),deleteByBookKeyStatement:se(le)},jsonToSqlite:se({notes:e=>{let a=Object.assign({},e);return a.date=JSON.stringify(e.date),a.tag=JSON.stringify(e.tag),a},bookmarks:e=>e,books:e=>{let a=Object.assign({},e);return a.page=e.page||0,a},plugins:e=>{let a=Object.assign({},e);return e.autoValue||(a.autoValue=null),e.langList?a.langList=JSON.stringify(e.langList):a.langList=null,e.voiceList?a.voiceList=JSON.stringify(e.voiceList):a.voiceList=null,a.config=JSON.stringify(e.config),a},words:e=>{let a=Object.assign({},e);return a.date=JSON.stringify(e.date),void 0===a.sentence&&(a.sentence=""),a}}),sqliteToJson:se(de)};const ue=E.cloudUrl,me=E.cloudCNUrl;class pe{constructor(e,a,t){this.TokenService=e,this.ConfigService=a,this.baseUrl="china"===t?me:ue,this.serverRegion=t,this.refreshToken="",this.accessToken="",this.streamPromise=null,this.expiresAt=0}refreshUserToken(){return m(this,void 0,void 0,(function*(){if(this.refreshToken=yield this.TokenService.getToken("refresh_token"),!this.refreshToken)return{code:401,message:"refresh token not found"};let a=(yield e.post(this.baseUrl+"/api/v1/public/user/refresh_token",{refresh_token:this.refreshToken})).data;return 200===a.code&&(yield this.TokenService.setToken("access_token",a.data.access_token),yield this.TokenService.setToken("refresh_token",a.data.refresh_token),yield this.TokenService.setToken("expires_at",(1e3*a.data.expires_at).toString()),this.accessToken=a.data.access_token,this.refreshToken=a.data.refresh_token,this.expiresAt=1e3*a.data.expires_at),a}))}requestWithRetry(e){return m(this,void 0,void 0,(function*(){return pe.requestQueue||(pe.requestQueue=[]),new Promise(((a,t)=>{pe.requestQueue.push({config:e,resolve:a,reject:t}),pe.processingQueue||this.processQueue()}))}))}isTokenValid(){return m(this,void 0,void 0,(function*(){if(this.accessToken||(this.accessToken=(yield this.TokenService.getToken("access_token"))||""),!this.expiresAt){const e=yield this.TokenService.getToken("expires_at");this.expiresAt=e?parseInt(e):(new Date).getTime()+31536e9}return""!==this.accessToken&&this.expiresAt>(new Date).getTime()+6e4}))}processQueue(){return m(this,void 0,void 0,(function*(){if(!pe.processingQueue){pe.processingQueue=!0;try{for(;pe.requestQueue.length>0;){const e=pe.requestQueue.shift();try{let a=yield this.executeRequest(e.config);e.resolve(a)}catch(a){e.reject(a)}}}finally{pe.processingQueue=!1}}}))}executeRequest(a){return m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let t="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);if(a.baseURL=this.baseUrl,a.headers)a.headers.Authorization="Bearer "+this.accessToken,a.headers["X-Request-ID"]=t;else{let e=this.ConfigService.getItem("appVersion"),o=this.ConfigService.getItem("appPlatform");a.headers={Authorization:"Bearer "+this.accessToken,"X-Request-ID":t,"X-App-Version":e||"1.0.0","X-App-Platform":o||"web"}}let o=(yield e(a)).data;if(402===o.code){let t=yield this.refreshUserToken();if(200===t.code){return a.headers=a.headers||{},a.headers.Authorization="Bearer "+this.accessToken,(yield e(a)).data}return t}return 200!==o.code&&console.error("Request error:",o),o}catch(e){return console.error("Request execution error:",e),"Network Error"===e.message?{code:503,message:"network error",data:null,msg:"Network error, please try again later. 网络错误,请稍后再试。"}:{code:500,message:e.message||"Unknown error",msg:e.message||"Unknown error",data:null}}}))}requestWithStream(e,a,t){return m(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let o=this.accessToken||"",i="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((n,r)=>{let l=this.ConfigService.getItem("appVersion"),s=this.ConfigService.getItem("appPlatform");const d=new t(this.baseUrl+e.url,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+o,"X-Request-ID":i,"X-App-Version":l||"1.0.0","X-App-Platform":s||"web"},method:e.method,body:JSON.stringify(e.data),pollingInterval:0});d.addEventListener("open",(()=>{console.info("Connection to OpenAI established.")})),d.addEventListener("message",(e=>m(this,void 0,void 0,(function*(){if(!e.data)return;const t=JSON.parse(e.data);t.done?(d.close(),n(t)):a(t.data)})))),d.addEventListener("error",(e=>{if(console.info("Error:",e),!e.data)return;const t=JSON.parse(e.data);a(t.data),n(t),d.close()}))}))}finally{this.streamPromise=null}})))()),this.streamPromise}))}requestWithFetch(e,a){return m(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let t=this.accessToken||"",o="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((i,n)=>m(this,void 0,void 0,(function*(){let n=this.ConfigService.getItem("appVersion"),r=this.ConfigService.getItem("appPlatform");var l=new u(this.baseUrl+e.url,{headers:{"Content-Type":"text/plain",Authorization:"Bearer "+t,"X-Request-ID":o,"X-App-Version":n||"1.0.0","X-App-Platform":r||"web"},payload:JSON.stringify(e.data),method:"POST"});l.addEventListener("message",(e=>m(this,void 0,void 0,(function*(){if(!e.data)return;const t=JSON.parse(e.data);t.done?(l.close(),i(t)):a(t.data)})))),l.addEventListener("open",(e=>{console.info(e,"Connection to OpenAI established.")})),l.addEventListener("error",(e=>{if(console.error(e,"Error occurred while connecting to OpenAI"),!e.data)return;const t=JSON.parse(e.data);a(t.data),i(t),l.close()}))}))))}finally{this.streamPromise=null}})))()),this.streamPromise}))}}pe.processingQueue=!1,pe.requestQueue=[];class he extends pe{constructor(e,a,t){super(e,a,t)}getTransStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_trans_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getTransFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_trans_stream",data:e};return yield this.requestWithFetch(t,a)}))}getDictionary(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_dict",data:e};return yield this.requestWithRetry(a)}))}getBatchTrans(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_batch_trans",data:e};return yield this.requestWithRetry(a)}))}getSplitSentence(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_split_sentence",data:e};return yield this.requestWithRetry(a)}))}getAnswerStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_answer_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getAnswerFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_answer_stream",data:e};return yield this.requestWithFetch(t,a)}))}getSummaryStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_sum_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getSummaryFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_sum_stream",data:e};return yield this.requestWithFetch(t,a)}))}getDictionaryStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_dict_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getDictionaryFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_dict_stream",data:e};return yield this.requestWithFetch(t,a)}))}getGoogleFont(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_google_font",data:e};return yield this.requestWithRetry(a)}))}sendToKindle(e,a){return m(this,void 0,void 0,(function*(){let t=new FormData;t.append("file",e.file),t.append("email",e.email),t.append("file_name",e.fileName);const o={method:"post",url:"/api/v1/pro/reader/send_to_kindle",headers:{"Content-Type":"multipart/form-data"},data:t,onUploadProgress:a?t=>{var o;const i=t.total||(null===(o=e.file)||void 0===o?void 0:o.size)||0;i>0&&a(Math.min(t.loaded/i,1))}:void 0};return yield this.requestWithRetry(o)}))}detectLanguage(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/detect_language",data:e};return yield this.requestWithRetry(a)}))}getTTSAudio(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_tts_audio",data:e};return yield this.executeRequest(a)}))}getOcrResult(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_ocr_result",data:e};return yield this.executeRequest(a)}))}getOcrResultV2(e){return m(this,void 0,void 0,(function*(){let a=new FormData;a.append("file",e.file);const t={method:"post",url:"/api/v1/pro/reader/get_ocr_result_v2",headers:{"Content-Type":"multipart/form-data"},data:a};return yield this.executeRequest(t)}))}analyzeText(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/analyze_text",data:e};return yield this.requestWithRetry(a)}))}getBookMetadata(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_book_metadata",data:e};return yield this.requestWithRetry(a)}))}analyzeBookTitle(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/analyze_book_title",data:e};return yield this.requestWithRetry(a)}))}}class ge extends pe{constructor(e,a,t){super(e,a,t),this.serverRegion=t}encryptToken(e){return m(this,void 0,void 0,(function*(){let a=e.token,t=v.encode(a),{extracted:o,remaining:i}=function(e){let a="",t="",o=[],i=1;for(;i<=e.length;)o.push(i-1),i*=2;for(let i=0;i-1){let t=a.split("#");e.encrypted_token=t[1]}const t={method:"post",url:"/api/v1/pro/thirdparty/decrypt_token",data:e};let o=yield this.requestWithRetry(t);if(a.indexOf("#")>-1&&o.data&&o.data.token){let e=a.split("#"),t=function(e,a){let t="",o=[],i=1,n=e.length+a.length;for(;i<=n;)o.push(i-1),i*=2;let r=0,l=0;for(let i=0;i{let o="";if("github"===e?o=`https://github.com/login/oauth/authorize?client_id=${C.githubClientId}&redirect_uri=${t}&scope=${T.github.scopes.join(" ")}&response_type=code`:"google"===e?o=`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${t}&prompt=consent&response_type=code&client_id=${C.googleClientId}&scope=${T.google.scopes.join(" ")}&access_type=offline`:"facebook"===e?o=`https://www.facebook.com/v12.0/dialog/oauth?client_id=${C.facebookClientId}&redirect_uri=${t}&scope=&response_type=code`:"microsoft"===e&&(o=`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${C.microsoftClientId}&scope=${T.microsoft.scopes.join(" ")}&response_type=code&redirect_uri=${t}`),"manual"===a)return o;let i=JSON.stringify({deeplink:"desktop"===a?"koodo-reader://callback":"browser"===a?`${C.callbackUrl}#/login`:"",service:e});return`${o}&state=${"state|"+encodeURIComponent(i)}`}};class Ne{static CompareDatabase(e,a,t){return m(this,void 0,void 0,(function*(){let o=Object.keys(e).filter((e=>e.startsWith("database.sqlite.books"))),i=Object.keys(e).filter((e=>e.startsWith("database.sqlite.notes"))),n=Object.keys(e).filter((e=>e.startsWith("database.sqlite.bookmarks"))),r=Object.keys(e).filter((e=>e.startsWith("database.sqlite.plugins"))),l=Object.keys(e).filter((e=>e.startsWith("database.sqlite.words"))),s=Object.keys(a).filter((e=>e.startsWith("database.sqlite.books"))),d=Object.keys(a).filter((e=>e.startsWith("database.sqlite.notes"))),c=Object.keys(a).filter((e=>e.startsWith("database.sqlite.bookmarks"))),u=Object.keys(a).filter((e=>e.startsWith("database.sqlite.plugins"))),m=Object.keys(a).filter((e=>e.startsWith("database.sqlite.words"))),p={books:Array.from(new Set(o.concat(s))),notes:Array.from(new Set(i.concat(d))),bookmarks:Array.from(new Set(n.concat(c))),plugins:Array.from(new Set(r.concat(u))),words:Array.from(new Set(l.concat(m)))},h={books:{save:[],update:[],delete:[],conflict:[],upload:[]},notes:{save:[],update:[],delete:[],conflict:[],upload:[]},bookmarks:{save:[],update:[],delete:[],conflict:[],upload:[]},plugins:{save:[],update:[],delete:[],conflict:[],upload:[]},words:{save:[],update:[],delete:[],conflict:[],upload:[]}},g=["books","notes","bookmarks","plugins","words"];for(let o of g)for(let i of p[o]){let n=i.split(".")[3],r=e[i],l=a[i];r?l?("save"===l.operation&&("update"!==r.operation&&"delete"!==r.operation||h[o].upload.push(n)),"delete"===l.operation&&("save"===r.operation&&(h[o].delete.push(n),e[i]=l),"update"===r.operation&&(r.timel.time&&(h[o].conflict.push(n),"cloud"===t?(h[o].delete.push(n),e[i]=l):h[o].upload.push(n))),r.operation),"update"===l.operation&&("save"===r.operation&&(h[o].update.push(n),e[i]=l),"update"===r.operation&&(r.timel.time&&h[o].upload.push(n)),"delete"===r.operation&&(r.timel.time&&h[o].upload.push(n)))):h[o].upload.push(n):(h[o].save.push(n),e[i]=l)}return{compareResult:h,syncRecords:e}}))}static CompareConfig(e,a,t){return m(this,void 0,void 0,(function*(){let o=Object.keys(e).filter((e=>e.startsWith("config.readerConfig"))),i=Object.keys(e).filter((e=>e.startsWith("config.listConfig"))),n=Object.keys(e).filter((e=>e.startsWith("config.objectConfig"))),r=Object.keys(e).filter((e=>e.startsWith("config.mapConfig"))),l=Object.keys(a).filter((e=>e.startsWith("config.readerConfig"))),s=Object.keys(a).filter((e=>e.startsWith("config.listConfig"))),d=Object.keys(a).filter((e=>e.startsWith("config.objectConfig"))),c=Object.keys(a).filter((e=>e.startsWith("config.mapConfig"))),u={readerConfig:Array.from(new Set(o.concat(l))),listConfig:Array.from(new Set(i.concat(s))),objectConfig:Array.from(new Set(n.concat(d))),mapConfig:Array.from(new Set(r.concat(c)))},m={readerConfig:{update:[],upload:[]},listConfig:{update:[],upload:[]},objectConfig:{update:[],delete:[],conflict:[],save:[],upload:[]},mapConfig:{update:[],delete:[],conflict:[],save:[],upload:[]}},p=["readerConfig","listConfig"];for(let t of p)for(let o of u[t]){let i=o,n=e[o],r=a[o];n?r?n.timer.time&&m[t].upload.push(i):m[t].upload.push(i):(m[t].update.push(i),e[o]=r)}let h=["objectConfig","mapConfig"];for(let o of h)for(let i of u[o]){let n=i,r=e[i],l=a[i];r?l?("delete"===l.operation&&("update"===r.operation&&(r.timel.time&&(m[o].conflict.push(n),"cloud"===t?(m[o].delete.push(n),e[i]=l):m[o].upload.push(n))),r.operation),"update"===l.operation&&("update"===r.operation&&(r.timel.time&&m[o].upload.push(n)),"delete"===r.operation&&(r.timel.time&&m[o].upload.push(n)))):m[o].upload.push(n):(m[o].update.push(n),e[i]=l)}return{compareResult:m,syncRecords:e}}))}static compareAll(e,a,t,o,i){return m(this,void 0,void 0,(function*(){let n="cloud";if("yes"===t.getReaderConfig("isKeepLocal")){n="local";let e=t.getObjectConfig(yield o.getFingerprint(),"cloudSyncTime",{time:0,conflictMode:"cloud"}),a=yield i.getCloudConfig("config"),r=JSON.parse(a.cloudSyncTime||"{}");delete r[yield o.getFingerprint()],Object.values(r).filter((a=>"local"===a.conflictMode&&a.time>e.time)).length>0&&(n="cloud")}let{compareResult:r,syncRecords:l}=yield this.CompareDatabase(e,a,n),{compareResult:s,syncRecords:d}=yield this.CompareConfig(l,a,n),c=Object.assign(Object.assign({},r),s);return t.setAllSyncRecord(d),"local"===n&&(c.books.conflict.length>0||c.notes.conflict.length>0||c.bookmarks.conflict.length>0||c.plugins.conflict.length>0||c.words.conflict.length>0||c.objectConfig.conflict.length>0||c.mapConfig.conflict.length>0)?t.setObjectConfig(yield o.getFingerprint(),{time:(new Date).getTime(),conflictMode:"local"},"cloudSyncTime"):t.setObjectConfig(yield o.getFingerprint(),{time:(new Date).getTime(),conflictMode:"cloud"},"cloudSyncTime"),c}))}static startSync(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){let r=yield this.syncConfig(e,a,t,i,n,o);if(e.books.save.length>0||e.books.upload.length>0){let e=yield this.syncCover(a,n,i),t=yield this.syncBook(a,i);return[...r,...e,...t]}return r}))}static syncConfig(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){let r=[];for(let a of h){if(e[a].save.length+e[a].update.length>0){let o=yield n.getCloudDatabase(a);for(let i of e[a].save){let e=o.find((e=>e.key===i));e&&(yield t.saveRecord(e,a))}for(let i of e[a].update){let e=o.find((e=>e.key===i));e&&(yield t.updateRecord(e,a,!1))}}if(e[a].delete.length>0)for(let n of e[a].delete)"books"===a&&(yield o.deleteOfflineBook(n),yield i.deleteOfflineCover(n)),yield t.deleteRecord(n,a);yield t.dumpDatabase(a,!0)}if(e.readerConfig.update.length>0||e.listConfig.update.length>0||e.objectConfig.update.length>0||e.mapConfig.update.length>0){let t=yield n.getCloudConfig("config");for(let o of e.readerConfig.update){let e=o.split(".")[3];t.readerConfig&&a.setReaderConfig(e,JSON.parse(t.readerConfig)[e],!1)}for(let o of e.listConfig.update){let e=o.split(".")[3];t[e]&&a.setAllListConfig(JSON.parse(t[e]),e,!1)}for(let o of e.objectConfig.update){let e=o.split(".")[3],i=o.split(".")[2];t[i]&&JSON.parse(t[i])&&JSON.parse(t[i])[e]&&a.setObjectConfig(e,JSON.parse(t[i])[e],i,!1)}for(let o of e.mapConfig.update){let e=o.split(".")[3],i=o.split(".")[2];if(t[i]&&JSON.parse(t[i])&&JSON.parse(t[i])[e]){let o=JSON.parse(t[i])[e];a.setOneMapConfig(e,o,i,!1)}}}if(e.objectConfig.delete.length>0||e.mapConfig.delete.length>0){for(let t of e.objectConfig.delete){let e=t.split(".")[3],o=t.split(".")[2];a.deleteObjectConfig(e,o)}for(let t of e.mapConfig.delete){let e=t.split(".")[3],o=t.split(".")[2];a.deleteMapConfig(e,o)}}for(let a of h)e[a].upload.length>0&&r.push((()=>n.uploadDatabase(a)));return r.push((()=>n.uploadConfig("config"))),r.push((()=>n.uploadConfig("sync"))),r}))}static syncCover(e,a,t){return m(this,void 0,void 0,(function*(){let t=yield a.getLocalCoverList(),o=yield a.getCloudCoverList(),i=Array.from(new Set([...t,...o])),n=[];for(let r of i)t.includes(r)&&!o.includes(r)&&n.push((()=>a.uploadCover(r))),!t.includes(r)&&o.includes(r)&&"adrive"!==e.getItem("defaultSyncOption")&&n.push((()=>a.downloadCover(r)));return n}))}static syncBook(e,a){return m(this,void 0,void 0,(function*(){let t=yield a.getLocalBookList(),o=yield a.getCloudBookList(),i=[],n=Array.from(new Set([...t,...o]));for(let r of n){if(t.includes(r)&&!o.includes(r)){let e=r.split(".")[0],t=r.split(".")[1];i.push((()=>a.uploadBook(e,t)))}let n="yes"===e.getReaderConfig("autoOffline");if(!t.includes(r)&&o.includes(r)&&n&&"adrive"!==e.getItem("defaultSyncOption")){let e=r.split(".")[0],t=r.split(".")[1]||"epub";i.push((()=>a.offlineBook(e,t.toUpperCase())))}}return i}))}static runTasksWithLimit(e,a,t){return m(this,void 0,void 0,(function*(){if("ftp"!==t&&"adrive"!==t){const t=[],o=[];for(const i of e){const e=i().then((a=>(o.splice(o.indexOf(e),1),a)));t.push(e),o.push(e),o.length>=a&&(yield Promise.race(o))}return Promise.all(t)}for(let a of e)yield a()}))}}class ve{constructor(e,a){this.bookKey="",this.sessionStart=0,this.unregisterUnload=null,this.configService=e,this.platform=a}getDailySeconds(e,a){const t=((this.configService.getAllMapConfig("readingStats")||{})[a]||[]).find((a=>a.startsWith(e+"-")));if(!t)return 0;const o=t.split("-");return parseInt(o[o.length-1],10)||0}setDailySeconds(e,a,t){const o=(this.configService.getAllMapConfig("readingStats")||{})[a]||[],i=`${e}-${t}`,n=o.filter((a=>!a.startsWith(e+"-")));this.configService.setOneMapConfig(a,[...n,i],"readingStats")}start(e){this.bookKey=e,this.sessionStart=Date.now(),this.unregisterUnload=this.platform.registerUnloadHandler((()=>{var e,a;this.commit(),null===(a=(e=this.platform).onBeforeClose)||void 0===a||a.call(e)}))}stop(){var e;this.commit(),null===(e=this.unregisterUnload)||void 0===e||e.call(this),this.unregisterUnload=null,this.bookKey="",this.sessionStart=0}commit(){if(!this.bookKey||!this.sessionStart)return;const e=Date.now()-this.sessionStart;if(e<1e3)return void(this.sessionStart=0);const a=Math.round(e/1e3);this.sessionStart=0;const t=this.configService.getObjectConfig(this.bookKey,"readingTime",0);this.configService.setObjectConfig(this.bookKey,t+a,"readingTime");const o=function(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}(),i=this.getDailySeconds(this.bookKey,o);this.setDailySeconds(this.bookKey,o,i+a)}getTotalSeconds(e){return this.configService.getObjectConfig(e,"readingTime",0)}getDailySecondsForBook(e,a){return this.getDailySeconds(e,a)}getDayStats(e){return((this.configService.getAllMapConfig("readingStats")||{})[e]||[]).map((e=>{const a=e.lastIndexOf("-");return{bookKey:e.substring(0,a),seconds:parseInt(e.substring(a+1),10)||0}}))}getAllDates(){const e=this.configService.getAllMapConfig("readingStats");return Object.keys(e||{})}}const be="Koodo Reader",ke="application/vnd.koreader.v1+json";class Se extends Error{constructor(e,a,t,o){super(e),this.name="KOReaderRequestError",this.status=a,this.code=t,this.body=o}}const Ee=e=>{const a=(e||"").trim();if(!a)return"";return(/^https?:\/\//i.test(a)?a:`https://${a}`).replace(/\/+$/,"")},Ce=e=>{const a="number"==typeof e?e:parseFloat((e||"0")+"");return!isFinite(a)||isNaN(a)?0:a>1&&a<=100?Math.min(Math.max(a/100,0),1):Math.min(Math.max(a,0),1)},Te=(e,a={})=>m(void 0,void 0,void 0,(function*(){const t=yield fetch(e,a);return t.ok||(yield(e=>m(void 0,void 0,void 0,(function*(){let a=null;try{a=yield e.json()}catch(t){try{a=yield e.text()}catch(e){a=null}}const t=(null==a?void 0:a.message)||(null==a?void 0:a.error)||(null==a?void 0:a.msg)||("string"==typeof a?a:"")||e.statusText||"Request failed";throw console.error(`[KOReader] HTTP ${e.status} error: ${t}`,null!=a?a:"(no body)"),new Se(t,e.status,null==a?void 0:a.code,a)})))(t)),204===t.status?{}:yield t.json()})),we=e=>({Accept:ke,"Content-Type":"application/json","x-auth-user":e.username,"x-auth-key":e.passwordHash});class Ae{constructor(e,a,t){this.getKOReaderSyncConfig=()=>{let e;try{e=this.ConfigService.getObjectConfig("koReaderSyncConfig","thirdpartyToken",{})}catch(e){return console.error("[KOReader] Failed to read koReaderSyncConfig:",e),null}if(!e||"object"!=typeof e)return console.error("[KOReader] koReaderSyncConfig is missing or invalid"),null;const a=Ee(e.serverUrl||""),t=(e.username||"").trim(),o=(e.passwordHash||"").trim();return a&&t&&o?{serverUrl:a,username:t,passwordHash:o}:(console.error("[KOReader] Incomplete config — missing fields"),null)},this.getLocalRecordLocation=e=>this.ConfigService.getObjectConfig(e,"recordLocation",{})||{},this.persistKOReaderMetadata=(e,a,t)=>{const o=Object.assign(Object.assign({},a),{percentage:t.percentage.toString(),xpath:t.progress,timestamp:t.timestamp||parseInt(Date.now()/1e3+"")});this.ConfigService.setObjectConfig(e,o,"recordLocation")},this.authUser=e=>m(this,void 0,void 0,(function*(){return yield Te(`${e.serverUrl}/users/auth`,{method:"GET",headers:we(e)})})),this.createUser=e=>m(this,void 0,void 0,(function*(){return yield Te(`${e.serverUrl}/users/create`,{method:"POST",headers:{Accept:ke,"Content-Type":"application/json"},body:JSON.stringify({username:e.username,password:e.passwordHash})})})),this.getBookProgress=(e,a)=>m(this,void 0,void 0,(function*(){const t=yield Te(`${e.serverUrl}/syncs/progress/${encodeURIComponent(a)}`,{method:"GET",headers:we(e)});return t&&0!==Object.keys(t).length?{document:a,percentage:Ce(t.percentage),progress:t.progress||"",device:t.device||"",device_id:t.device_id||"",timestamp:t.timestamp||0}:null})),this.updateBookProgress=(e,a)=>m(this,void 0,void 0,(function*(){yield Te(`${e.serverUrl}/syncs/progress`,{method:"PUT",headers:we(e),body:JSON.stringify({document:a.document,percentage:a.percentage,progress:a.progress,device:a.device||be,device_id:a.device_id||"",timestamp:a.timestamp||parseInt(Date.now()/1e3+"")})})})),this.buildLocalUploadPayload=(e,a,t,o)=>m(this,void 0,void 0,(function*(){const i=Ce(a.percentage),n=a.xpath||"",r=this.ConfigService.getObjectConfig(e.key,"koreaderBooks",{});if(!r.document){let a=yield o(e);if(!a)return console.error(`[KOReader] Cannot build upload payload for "${e.name}": failed to compute partial MD5`),null;r.document=a,this.ConfigService.setObjectConfig(e.key,r,"koreaderBooks")}return n?{document:r.document,percentage:i,progress:n,device:be,device_id:t,timestamp:a.timestamp||parseInt(Date.now()/1e3+"")}:(console.error(`[KOReader] Cannot build upload payload for "${e.name}": no xpath/progress recorded (localRecord.xpath is empty)`),null)})),this.resolveDeviceId=()=>m(this,void 0,void 0,(function*(){try{return(yield this.TokenService.getFingerprint())||"koodo-reader"}catch(e){return console.error("[KOReader] Failed to get device fingerprint, using fallback ID:",e),"koodo-reader"}})),this.verifyAndBuildKOReaderSyncConfig=e=>m(this,void 0,void 0,(function*(){const a={serverUrl:Ee(e.serverUrl),username:(e.username||"").trim(),passwordHash:(e.password||"").trim()?s.MD5((e.password||"").trim()).toString():(e.passwordHash||"").trim()};if(!a.serverUrl||!a.username||!a.passwordHash)throw new Error("Please fill in all fields");try{return yield this.authUser(a),a}catch(e){console.error(`[KOReader] Auth failed for user "${a.username}" at ${a.serverUrl}, attempting to create user:`,e);try{return yield this.createUser(a),yield this.authUser(a),a}catch(o){if((t=o)instanceof Se&&(2002===t.code||(t.message||"").toLowerCase().includes("already exists")))throw console.error(`[KOReader] User "${a.username}" already exists but auth failed. Original auth error:`,e),e;throw console.error(`[KOReader] Failed to create user "${a.username}":`,o),o}}var t})),this.syncKOReaderProgress=e=>m(this,void 0,void 0,(function*(){const a=this.getKOReaderSyncConfig();if(!a)throw new Error("Please configure the KOReader sync server first");yield this.authUser(a);const t=yield this.resolveDeviceId(),o=(yield this.DatabaseService.getAllRecords("books"))||[],i={checkedBooks:0,matchedBooks:0,pulledBooks:0,pushedBooks:0,skippedBooks:0};for(const n of o)try{i.checkedBooks++;const o=this.getLocalRecordLocation(n.key);if(!o||!o.xpath){console.error(`[KOReader] Skipping "${n.name}": no local reading progress (xpath) found`),i.skippedBooks++;continue}const r=this.ConfigService.getObjectConfig(n.key,"koreaderBooks",{});if(!r.document){let a=yield e(n);if(!a){console.error(`[KOReader] Skipping "${n.name}": failed to compute partial MD5 for document ID`),i.skippedBooks++;continue}r.document=a,this.ConfigService.setObjectConfig(n.key,r,"koreaderBooks")}let l=r.document;const s=yield this.getBookProgress(a,l),d=(null==s?void 0:s.timestamp)||0,c=o.timestamp||0;if(s){if(i.matchedBooks++,d>c)this.persistKOReaderMetadata(n.key,o,s),i.pulledBooks++;else{if(!(d{if("number"!=typeof e){const[a,t]=e.split("-");return{styleType:a,color:t}}if(e>=0&&e-1,t=parseInt(xe[e].split("-")[1]);return{styleType:a?"background":"underline",color:a?Ie[t]:Fe[t]}}return{styleType:"background",color:"#FEF3CD"}},this.formatHighlightValue=e=>`${e.styleType}-${e.color}`,this.getNoteHighlightString=()=>this.ConfigService.getReaderConfig(Me)||"background-#FEF3CD",this.getNoteHighlightValue=()=>{const e=this.getNoteHighlightString();if(!e)return Ue;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveNoteHighlightValue=e=>{this.ConfigService.setReaderConfig(Me,`${e.styleType}-${e.color}`)},this.getTtsHighlightString=()=>this.ConfigService.getReaderConfig(_e)||Re,this.getTtsHighlightValue=()=>{const e=this.getTtsHighlightString();if(!e)return Oe;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveTtsHighlightValue=e=>{this.ConfigService.setReaderConfig(_e,`${e.styleType}-${e.color}`)},this.getSearchHighlightString=()=>this.ConfigService.getReaderConfig($e)||Re,this.getSearchHighlightValue=()=>{const e=this.ConfigService.getReaderConfig($e);if(!e)return Oe;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveSearchHighlightValue=e=>{this.ConfigService.setReaderConfig($e,`${e.styleType}-${e.color}`)},this.buildHighlightStyleForType=(e,a,t)=>{let o="background",i="#FEF3CD";if("number"==typeof e){if(e>=0&&e-1,t=parseInt(xe[e].split("-")[1]);o=a?"background":"underline",i=a?Ie[t]:Fe[t]}}else o=e.split("-")[0],i=e.split("-")[1];const n="background"===o?((e,a)=>{const t=e.replace("#",""),o=3===t.length?t.split("").map((e=>e+e)).join(""):t;return 6!==o.length?e:`rgba(${parseInt(o.slice(0,2),16)}, ${parseInt(o.slice(2,4),16)}, ${parseInt(o.slice(4,6),16)}, ${a})`})(i,.8):i;switch(o){case"background":return a?`background: ${n}; mix-blend-mode: multiply;`:`background: ${n};`;case"underline":return a?t?`border-right: 2px solid ${n};`:`border-bottom: 2px solid ${n};`:`text-decoration: underline; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return a?`background: linear-gradient(transparent calc(50% - 1px), ${n} calc(50% - 1px), ${n} calc(50% + 1px), transparent calc(50% + 1px));`:t?`background: linear-gradient(to right, transparent calc(50% - 1px), ${n} calc(50% - 1px), ${n} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const e=i.replace("#","%23");if(a){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${e}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(t){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${e}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${n};`}},this.buildHighlightPreviewStyle=(e,a)=>{switch(e){case"background":default:return{background:a};case"underline":return{textDecoration:"underline",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"};case"strikethrough":return{textDecoration:"line-through",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"};case"wavy":return{textDecorationLine:"underline",textDecorationStyle:"wavy",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"}}},this.convertNumberToHighlightValue=e=>this.getHighlightValue(e),this.buildTtsHighlightStyle=(e,a)=>this.buildHighlightStyleForType(this.getTtsHighlightString(),e,a),this.buildTtsHighlightPreviewStyle=(e,a)=>this.buildHighlightPreviewStyle(e,a),this.buildSearchHighlightStyle=(e,a)=>this.buildHighlightStyleForType(this.getSearchHighlightString(),e,a),this.buildSearchHighlightPreviewStyle=(e,a)=>this.buildHighlightPreviewStyle(e,a),this.ConfigService=e}}const ze=(De=class{static getItem(e){return localStorage.getItem(e)}static setItem(e,a){localStorage.setItem(e,a)}static removeItem(e){localStorage.removeItem(e)}},Le="browser",class extends De{static getReaderConfig(e){return w.includes(e)&&"undefined"!=typeof window&&window.currentBookKey&&this.getAllListConfig("seperateStyleBooks").includes(window.currentBookKey)?this.getObjectConfig(window.currentBookKey,"seperateStyleConfig",{})[e]:JSON.parse(this.getItem("readerConfig")||"{}")[e]}static setReaderConfig(e,a,t=!0){if(w.includes(e)&&"undefined"!=typeof window&&window.currentBookKey&&this.getAllListConfig("seperateStyleBooks").includes(window.currentBookKey)){let o=this.getObjectConfig(window.currentBookKey,"seperateStyleConfig",{});return o[e]=a,void this.setObjectConfig(window.currentBookKey,o,"seperateStyleConfig",t)}let o=JSON.parse(this.getItem("readerConfig")||"{}");o[e]=a,this.setItem("readerConfig",JSON.stringify(o)),t&&this.setSyncRecord({type:"config",catergory:"readerConfig",name:Le,key:e},{operation:"update",time:Date.now()})}static getAllListConfig(e){return("{}"!==this.getItem(e)&&this.getItem(e)?JSON.parse(this.getItem(e)||""):[])||[]}static deleteListConfig(e,a){let t=this.getAllListConfig(a);const o=t.indexOf(e);o>-1&&t.splice(o,1),this.setAllListConfig(t,a)}static setListConfig(e,a){let t=this.getAllListConfig(a);const o=t.indexOf(e);o>-1?(t.splice(o,1),t.unshift(e)):t.unshift(e),this.setAllListConfig(t,a)}static setAllListConfig(e,a,t=!0){this.setItem(a,JSON.stringify(e)),t&&this.setSyncRecord({type:"config",catergory:"listConfig",name:"general",key:a},{operation:"update",time:Date.now()})}static setObjectConfig(e,a,t,o=!0){let i=this.getAllObjectConfig(t);i[e]=a,o&&this.setSyncRecord({type:"config",catergory:"objectConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllObjectConfig(i,t)}static getObjectConfig(e,a,t){return this.getAllObjectConfig(a)[e]||t}static getAllObjectConfig(e){let a=this.getItem(e);return JSON.parse(a)||{}}static setAllObjectConfig(e,a){this.setItem(a,JSON.stringify(e))}static deleteObjectConfig(e,a){let t=this.getAllObjectConfig(a);delete t[e],this.setSyncRecord({type:"config",catergory:"objectConfig",name:a,key:e},{operation:"delete",time:Date.now()}),this.setAllObjectConfig(t,a)}static getAllMapConfig(e){let a=this.getItem(e);return JSON.parse(a)||{}}static getMapConfig(e,a){return this.getAllMapConfig(a)[e]||[]}static setAllMapConfig(e,a){this.setItem(a,JSON.stringify(e))}static setMapConfig(e,a,t){let o=this.getAllMapConfig(t);void 0===o[e]&&(o[e]=[]),a&&-1===o[e].indexOf(a)&&o[e].unshift(a),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,t)}static setOneMapConfig(e,a,t,o=!0){let i=this.getAllMapConfig(t);i[e]=a,o&&this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(i,t)}static deleteFromMapConfig(e,a,t){let o=this.getAllMapConfig(t),i=o[e].indexOf(a);o[e].splice(i,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,t)}static deleteFromAllMapConfig(e,a){let t=this.getAllMapConfig(a);Object.keys(t).forEach((o=>{let i=t[o].indexOf(e);i>-1&&(t[o].splice(i,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:a,key:o},{operation:"update",time:Date.now()}))})),this.setAllMapConfig(t,a)}static deleteMapConfig(e,a){let t=this.getAllMapConfig(a);delete t[e],this.setSyncRecord({type:"config",catergory:"mapConfig",name:a,key:e},{operation:"delete",time:Date.now()}),this.setAllMapConfig(t,a)}static getFromAllMapConfig(e,a){let t=this.getAllMapConfig(a),o=[];for(let a in t)t[a]&&t[a].indexOf(e)>-1&&o.push(a);return o}static getSyncRecord(e){return JSON.parse(this.getItem("syncRecord")||"{}")[e.type+"."+e.catergory+"."+e.name+"."+e.key]||{operation:"",time:0}}static getAllSyncRecord(){return JSON.parse(this.getItem("syncRecord")||"{}")}static setSyncRecord(e,a){const t=e.type+"."+e.catergory+"."+e.name+"."+e.key;let o=JSON.parse(this.getItem("syncRecord")||"{}");o[t]=a,this.setItem("syncRecord",JSON.stringify(o))}static setAllSyncRecord(e){this.setItem("syncRecord",JSON.stringify(e))}});var De,Le;class Pe{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("notionSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Notion] notionSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Notion] Failed to read notionSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableNotionSync")}resolveDatabaseId(e,a){return m(this,void 0,void 0,(function*(){const t=yield fetch(`https://api.notion.com/v1/blocks/${a}/children`,{method:"GET",headers:{Authorization:`Bearer ${e}`,"Notion-Version":"2022-06-28"}});if(!t.ok){const e=yield t.json().catch((()=>null));throw console.error(`[Notion] resolveDatabaseId failed for page ${a}: HTTP ${t.status} ${t.statusText}`,JSON.stringify(e)),new Error(`Notion resolve database error: ${t.status} ${t.statusText}`)}const o=yield t.json(),i=(o.results||[]).find((e=>"child_database"===e.type));if(!i)throw console.error(`[Notion] No child_database block found under page ${a}. Available block types:`,JSON.stringify((o.results||[]).map((e=>e.type)))),new Error(`No child database found in page ${a}. Please provide a Database ID directly.`);return i.id}))}findOrCreatePage(e,a,t){return m(this,void 0,void 0,(function*(){const o=`${t}`,i=yield fetch(`https://api.notion.com/v1/databases/${a}/query`,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({filter:{property:"title",title:{equals:o}}})});if(!i.ok){const o=yield i.json().catch((()=>({})));if(400===i.status&&"validation_error"===(null==o?void 0:o.code)&&"string"==typeof(null==o?void 0:o.message)&&o.message.includes("is a page, not a database")){console.error(`[Notion] Provided databaseId "${a}" is a page, not a database. Resolving child database...`);const o=yield this.resolveDatabaseId(e,a);return this.findOrCreatePage(e,o,t)}throw console.error(`[Notion] Database query failed for databaseId "${a}" (book: "${t}"): HTTP ${i.status} ${i.statusText}`,JSON.stringify(o)),new Error(`Notion API error: ${i.status} ${i.statusText}`)}const n=yield i.json();if(n.results&&n.results.length>0)return n.results[0].id;const r=yield fetch("https://api.notion.com/v1/pages",{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({parent:{database_id:a},properties:{title:{title:[{text:{content:o}}]}}})});if(!r.ok){const e=yield r.json().catch((()=>null));throw console.error(`[Notion] Failed to create page for book "${t}" in database "${a}": HTTP ${r.status} ${r.statusText}`,JSON.stringify(e)),new Error(`Notion create page error: ${r.status} ${r.statusText}`)}return(yield r.json()).id}))}appendBlocks(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=!t.notes||0===t.notes.length,n=[];n.push({object:"block",type:"divider",divider:{}}),o&&n.push({object:"block",type:"heading_3",heading_3:{rich_text:[{type:"text",text:{content:o}}]}}),n.push({object:"block",type:"quote",quote:{rich_text:[{type:"text",text:{content:t.text||""}}]}}),!i&&t.notes&&n.push({object:"block",type:"paragraph",paragraph:{rich_text:[{type:"text",text:{content:`📝 ${t.notes}`}}]}});const r=`${t.date.year}-${String(t.date.month).padStart(2,"0")}-${String(t.date.day).padStart(2,"0")}`;n.push({object:"block",type:"paragraph",paragraph:{rich_text:[{type:"text",text:{content:`Added on ${r}`},annotations:{italic:!0,color:"gray"}}]}});const l=yield fetch(`https://api.notion.com/v1/blocks/${a}/children`,{method:"PATCH",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({children:n})});if(!l.ok){const e=yield l.json().catch((()=>null));throw console.error(`[Notion] Failed to append blocks to page ${a}: HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),new Error(`Notion append blocks error: ${l.status} ${l.statusText}`)}}))}syncNote(e,a){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const t=this.getConfig();if(!t)return!1;try{const o=yield this.findOrCreatePage(t.token,t.databaseId,a);return yield this.appendBlocks(t.token,o,e,e.chapter||""),!0}catch(e){return console.error(`[Notion] Sync failed for book "${a}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class je{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("yuqueSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Yuque] yuqueSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Yuque] Failed to read yuqueSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableYuqueSync")}generateDocSlug(e){return m(this,void 0,void 0,(function*(){const a=(e||"").trim()||"untitled",t=a.toLowerCase().replace(/[^a-z0-9_.-]/g,"-").replace(/[-_.]{2,}/g,"-").replace(/^[-_.]+|[-_.]+$/g,"")||"book",o=(yield y(a)).slice(0,16),i=t,n=190-o.length-1;return`${i.substring(0,n).replace(/^[-_.]+|[-_.]+$/g,"")||"book"}-${o}`}))}findOrCreateDoc(e,a,t){return m(this,void 0,void 0,(function*(){const o=`${t}`,i=yield this.generateDocSlug(t);try{const t=yield fetch(`${je.API_BASE}/repos/${a}/docs/${i}`,{method:"GET",headers:{"X-Auth-Token":e,"Content-Type":"application/json"}});if(t.ok){const e=yield t.json();return{id:e.data.id,slug:e.data.slug,body:e.data.body||""}}if(404!==t.status){const e=yield t.json().catch((()=>null));console.error(`[Yuque] Unexpected error fetching doc "${i}" in repo "${a}": HTTP ${t.status} ${t.statusText}`,JSON.stringify(e))}}catch(e){console.error(`[Yuque] Network error fetching doc "${i}" in repo "${a}":`,JSON.stringify(e))}const n=yield fetch(`${je.API_BASE}/repos/${a}/docs`,{method:"POST",headers:{"X-Auth-Token":e,"Content-Type":"application/json"},body:JSON.stringify({title:o,slug:i,body:`# ${o}\n\n`,format:"markdown"})});if(!n.ok){const e=yield n.json().catch((()=>null));throw console.error(`[Yuque] Failed to create doc "${o}" in repo "${a}": HTTP ${n.status} ${n.statusText}`,JSON.stringify(e)),new Error(`Yuque create doc error: ${n.status} ${n.statusText}`)}const r=yield n.json();return{id:r.data.id,slug:r.data.slug,body:r.data.body||""}}))}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="\n---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}updateDoc(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${je.API_BASE}/repos/${a}/docs/${t}`,{method:"PUT",headers:{"X-Auth-Token":e,"Content-Type":"application/json"},body:JSON.stringify({body:o,format:"markdown"})});if(!i.ok){const e=yield i.json().catch((()=>null));throw console.error(`[Yuque] Failed to update doc ${t} in repo "${a}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),new Error(`Yuque update doc error: ${i.status} ${i.statusText}`)}}))}syncNote(e,a){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const t=this.getConfig();if(!t)return!1;try{const o=yield this.findOrCreateDoc(t.token,t.namespace,a),i=this.formatNoteMarkdown(e),n=o.body+i;return yield this.updateDoc(t.token,t.namespace,o.id,n),!0}catch(e){return console.error(`[Yuque] Sync failed for book "${a}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}je.API_BASE="https://www.yuque.com/api/v2";class Ke{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("readwiseSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Readwise] readwiseSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Readwise] Failed to read readwiseSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableReadwiseSync")}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=`${a}`,n=!e.notes||0===e.notes.length,r={text:e.text||"",title:i,author:t||"Unknown",source_type:"koodo-reader",category:"books",highlighted_at:`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`};if(!n&&e.notes&&(r.note=e.notes),e.chapter){const a=parseInt(e.chapter,10);isNaN(a)||(r.location_type="order",r.location=a)}try{const e=yield fetch(`${Ke.API_BASE}/highlights/`,{method:"POST",headers:{Authorization:`Token ${o.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({highlights:[r]})});if(!e.ok){const a=yield e.json().catch((()=>null));throw console.error(`[Readwise] Failed to sync highlight for book "${i}": HTTP ${e.status} ${e.statusText}`,JSON.stringify(a)),new Error(`Readwise API error: ${e.status} ${e.statusText}`)}return!0}catch(a){return console.error(`[Readwise] Sync failed for book "${i}" (text: "${(e.text||"").substring(0,50)}..."):`,JSON.stringify(a instanceof Error?a.message:a)),!1}}))}}Ke.API_BASE="https://readwise.io/api/v2";class He{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("imaSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[IMA] imaSyncConfig is empty or not set"),null):e}catch(e){return console.error("[IMA] Failed to read imaSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableImaSync")}getHeaders(e){return{"Content-Type":"application/json","ima-openapi-clientid":e.clientId,"ima-openapi-apikey":e.apiKey}}formatNoteMarkdown(e,a,t){const o=!e.notes||0===e.notes.length,i=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let n="\n---\n\n";return e.chapter&&(n+=`### ${e.chapter}\n\n`),n+=`> ${e.text||""}\n\n`,!o&&e.notes&&(n+=`**Note:** ${e.notes}\n\n`),n+=`*${i}*\n`,n}findNoteByTitle(e,a){var t,o,i,n;return m(this,void 0,void 0,(function*(){try{const r=JSON.stringify({search_type:0,query_info:{title:a},start:0,end:20}),l=yield fetch(`${He.API_BASE}/search_note`,{method:"POST",headers:this.getHeaders(e),body:r});if(!l.ok){const e=yield l.json().catch((()=>null));return console.error(`[IMA] search_note failed for title "${a}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),null}const s=yield l.json();if(0!==s.code)return console.error(`[IMA] search_note returned error code ${s.code} for title "${a}":`,JSON.stringify(null!==(t=s.msg)&&void 0!==t?t:s)),null;const d=((null===(o=s.data)||void 0===o?void 0:o.search_note_infos)||[]).find((e=>{var t;return a.includes(null===(t=e.note_book_info)||void 0===t?void 0:t.title.replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu,""))}));return null!==(n=null===(i=null==d?void 0:d.note_book_info)||void 0===i?void 0:i.note_id)&&void 0!==n?n:null}catch(e){return console.error(`[IMA] Network error in search_note for title "${a}":`,JSON.stringify(e)),null}}))}createNote(e,a,t){var o,i,n;return m(this,void 0,void 0,(function*(){try{const r={content_format:1,content:`# ${a}\n\n${t}`};e.folderId&&(r.folder_id=e.folderId);const l=yield fetch(`${He.API_BASE}/import_doc`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify(r)});if(!l.ok){const e=yield l.json().catch((()=>null));return console.error(`[IMA] import_doc failed for note "${a}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),null}const s=yield l.json();return 0!==s.code?(console.error(`[IMA] import_doc returned error code ${s.code} for note "${a}":`,JSON.stringify(null!==(o=s.msg)&&void 0!==o?o:s)),null):null!==(n=null===(i=s.data)||void 0===i?void 0:i.note_id)&&void 0!==n?n:null}catch(e){return console.error(`[IMA] Network error in import_doc for note "${a}":`,JSON.stringify(e)),null}}))}appendNote(e,a,t){var o;return m(this,void 0,void 0,(function*(){try{const i=yield fetch(`${He.API_BASE}/append_doc`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify({note_id:a,content_format:1,content:t})});if(!i.ok){const e=yield i.json().catch((()=>null));return console.error(`[IMA] append_doc failed for noteId "${a}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),!1}const n=yield i.json();return 0===n.code||(console.error(`[IMA] append_doc returned error code ${n.code} for noteId "${a}":`,JSON.stringify(null!==(o=n.msg)&&void 0!==o?o:n)),!1)}catch(e){return console.error(`[IMA] Network error in append_doc for noteId "${a}":`,JSON.stringify(e)),!1}}))}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=this.formatNoteMarkdown(e,a,t);let n=yield this.findNoteByTitle(o,a);if(n){const e=yield this.appendNote(o,n,i);return e||console.error(`[IMA] Failed to append to existing note "${a}" (noteId: ${n})`),e}return n=yield this.createNote(o,a,i),n||console.error(`[IMA] Failed to create note for book "${a}"`),null!==n}))}}He.API_BASE="https://ima.qq.com/openapi/note/v1";class Je{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("siyuanSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[SiYuan] siyuanSyncConfig is empty or not set"),null):e}catch(e){return console.error("[SiYuan] Failed to read siyuanSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableSiYuanSync")}getHeaders(e){return{"Content-Type":"application/json",Authorization:`Token ${e}`}}findOrCreateNotebook(e,a){var t,o;return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/notebook/lsNotebooks`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({})});if(!i.ok){const a=yield i.json().catch((()=>null));throw console.error(`[SiYuan] lsNotebooks failed at ${e}: HTTP ${i.status} ${i.statusText}`,JSON.stringify(a)),new Error(`SiYuan list notebooks failed: ${i.status} ${i.statusText}`)}const n=yield i.json();if(0!==n.code)throw console.error(`[SiYuan] lsNotebooks returned error code ${n.code}:`,JSON.stringify(n.msg)),new Error(`SiYuan list notebooks error: ${n.msg}`);const r=(null!==(o=null===(t=n.data)||void 0===t?void 0:t.notebooks)&&void 0!==o?o:[]).find((e=>"Koodo Reader"===e.name));if(r)return r.id;const l=yield fetch(`${e}/api/notebook/createNotebook`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({name:"Koodo Reader"})});if(!l.ok){const a=yield l.json().catch((()=>null));throw console.error(`[SiYuan] createNotebook failed at ${e}: HTTP ${l.status} ${l.statusText}`,JSON.stringify(a)),new Error(`SiYuan create notebook failed: ${l.status} ${l.statusText}`)}const s=yield l.json();if(0!==s.code)throw console.error(`[SiYuan] createNotebook returned error code ${s.code}:`,JSON.stringify(s.msg)),new Error(`SiYuan create notebook error: ${s.msg}`);return s.data.notebook.id}))}findOrCreateDoc(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/query/sql`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({stmt:`SELECT id FROM blocks WHERE type='d' AND hpath='${o.replace(/'/g,"''")}' LIMIT 1`})});if(i.ok){const e=yield i.json();if(0!==e.code)console.error(`[SiYuan] SQL query for doc "${o}" returned error code ${e.code}:`,JSON.stringify(e.msg));else if(e.data&&e.data.length>0)return e.data[0].id}else{const e=yield i.json().catch((()=>null));console.error(`[SiYuan] SQL query for doc "${o}" failed: HTTP ${i.status} ${i.statusText}`,JSON.stringify(e))}const r=n?`**Author:** ${n}\n`:"",l=yield fetch(`${e}/api/filetree/createDocWithMd`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({notebook:t,path:o,markdown:r})});if(!l.ok){const e=yield l.json().catch((()=>null));throw console.error(`[SiYuan] createDocWithMd failed for "${o}" in notebook "${t}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),new Error(`SiYuan create doc failed: ${l.status} ${l.statusText}`)}const s=yield l.json();if(0!==s.code)throw console.error(`[SiYuan] createDocWithMd returned error code ${s.code} for "${o}":`,JSON.stringify(s.msg)),new Error(`SiYuan create doc error: ${s.msg}`);return s.data}))}appendMarkdownToDoc(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/block/appendBlock`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({data:o,dataType:"markdown",parentID:t})});if(!i.ok){const e=yield i.json().catch((()=>null));throw console.error(`[SiYuan] appendBlock failed for docId "${t}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),new Error(`SiYuan append block failed: ${i.status} ${i.statusText}`)}const n=yield i.json();if(0!==n.code)throw console.error(`[SiYuan] appendBlock returned error code ${n.code} for docId "${t}":`,JSON.stringify(n.msg)),new Error(`SiYuan append block error: ${n.msg}`)}))}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}sanitizePathComponent(e){return e.replace(/[\\/:*?"<>|]/g,"_").trim()}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const{serverUrl:i,token:n}=o;if(!i||!n)return console.error("[SiYuan] Sync skipped: config is missing serverUrl or token",JSON.stringify({hasServerUrl:!!i,hasToken:!!n})),!1;try{const o=yield this.findOrCreateNotebook(i,n),r=`/${this.sanitizePathComponent(a)}`,l=yield this.findOrCreateDoc(i,n,o,r,a,t),s=this.formatNoteMarkdown(e);return yield this.appendMarkdownToDoc(i,n,l,s),!0}catch(e){return console.error(`[SiYuan] Sync failed for book "${a}" at ${o.serverUrl}:`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class We{constructor(e,a){this.databaseService=e,this.notionSync=new Pe(a),this.yuqueSync=new je(a),this.readwiseSync=new Ke(a),this.imaSync=new He(a),this.siyuanSync=new Je(a)}getExtraServices(){return[]}getEnabledServices(){const e=[];return this.notionSync.isEnabled()&&e.push({name:"Notion",sync:this.notionSync.syncNote.bind(this.notionSync)}),this.yuqueSync.isEnabled()&&e.push({name:"Yuque",sync:this.yuqueSync.syncNote.bind(this.yuqueSync)}),this.readwiseSync.isEnabled()&&e.push({name:"Readwise",sync:this.readwiseSync.syncNote.bind(this.readwiseSync)}),this.imaSync.isEnabled()&&e.push({name:"IMA",sync:this.imaSync.syncNote.bind(this.imaSync)}),this.siyuanSync.isEnabled()&&e.push({name:"SiYuan",sync:this.siyuanSync.syncNote.bind(this.siyuanSync)}),[...e,...this.getExtraServices()]}syncNote(e,a){return m(this,void 0,void 0,(function*(){const t=this.getEnabledServices();if(0===t.length)return;let o="Unknown Book",i="";if(a||e.bookKey)try{const t=yield this.databaseService.getRecord(a||e.bookKey,"books");t&&t.name&&(o=t.name),t&&t.author&&(i=t.author)}catch(t){console.error(`[NoteSync] Failed to resolve book info for key: ${a||e.bookKey}`,JSON.stringify(t))}const n=(yield Promise.allSettled(t.map((a=>m(this,void 0,void 0,(function*(){var t,n,r,l;try{const r=yield a.sync(e,o,i);return r||console.error(`[NoteSync] ${a.name} sync returned false for book "${o}" (noteId: ${null!==(n=null!==(t=e.noteKey)&&void 0!==t?t:e.key)&&void 0!==n?n:"unknown"})`),{name:a.name,success:r}}catch(t){return console.error(`[NoteSync] ${a.name} sync threw an error for book "${o}" (noteId: ${null!==(l=null!==(r=e.noteKey)&&void 0!==r?r:e.key)&&void 0!==l?l:"unknown"}):`,JSON.stringify(t)),{name:a.name,success:!1}}})))))).filter((e=>"rejected"===e.status||"fulfilled"===e.status&&!e.value.success)).map((e=>"fulfilled"===e.status?e.value.name:"Unknown"));n.length>0&&console.error(`[NoteSync] Sync failed for services: ${n.join(", ")} | book: "${o}"`)}))}}class qe{constructor(e,a,t){this.configService=e,this.fs=a,this.path=t}getConfig(){try{const e=this.configService.getObjectConfig("markdownSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Markdown] markdownSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Markdown] Failed to read markdownSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableMarkdownSync")}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="\n---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}sanitizeFileName(e){return e.replace(/[\\/:*?"<>|]/g,"_").trim()}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=o.folder;if(!i)return console.error("[Markdown] Sync skipped: markdownSyncConfig.folder is not set"),!1;const n=this.fs,r=this.path;try{const o=this.sanitizeFileName(a),l=r.join(i,`${o}.md`);if(!n.existsSync(l)){const e=`# ${a}\n`,o=t?`**Author:** ${t}\n\n`:"\n";try{n.writeFileSync(l,e+o,"utf-8")}catch(e){return console.error(`[Markdown] Failed to create file "${l}" for book "${a}":`,JSON.stringify(e)),!1}}const s=this.formatNoteMarkdown(e);try{n.appendFileSync(l,s,"utf-8")}catch(e){return console.error(`[Markdown] Failed to append to file "${l}" for book "${a}":`,JSON.stringify(e)),!1}return!0}catch(e){return console.error(`[Markdown] Sync failed for book "${a}" in folder "${i}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class Ge extends We{constructor(e,a,t,o){super(e,a),this.markdownSync=new qe(a,t,o)}getExtraServices(){return this.markdownSync.isEnabled()?[{name:"Markdown",sync:this.markdownSync.syncNote.bind(this.markdownSync)}]:[]}}class Qe{constructor(a){this.syncWordToEudic=(a,t)=>m(this,void 0,void 0,(function*(){var o,i,n,r,l,s,d,c,u,m;if("yes"===this.configService.getReaderConfig("isEnableEudicSync"))try{let c;try{c=this.configService.getObjectConfig("eudicSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[Eudic] Failed to read eudicSyncConfig:",JSON.stringify(e))}if(!c||!c.accessToken)return void console.error("[Eudic] Sync skipped: config is missing or accessToken is not set",JSON.stringify({hasConfig:!!c}));const u=c.language||"en",m={Authorization:`NIS ${c.accessToken}`,"Content-Type":"application/json","User-Agent":"Mozilla/5.0"};let p="0";const h=(c.categoryName||"").trim();if(h)if(void 0!==c.categoryId)p=c.categoryId;else try{const a=(null===(o=(yield e.get(`https://api.frdic.com/api/open/v1/studylist/category?language=${u}`,{headers:m})).data)||void 0===o?void 0:o.data)||[],t=a.find((e=>e.name===h));t?p=t.id:console.error(`[Eudic] Category "${h}" not found among available categories:`,JSON.stringify(a.map((e=>e.name))));const i=Object.assign(Object.assign({},c),{categoryId:p});this.configService.setObjectConfig("eudicSyncConfig",i,"thirdpartyToken")}catch(e){console.error("[Eudic] Failed to fetch category list:",null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.status,JSON.stringify(null!==(r=null===(n=null==e?void 0:e.response)||void 0===n?void 0:n.data)&&void 0!==r?r:e))}try{yield e.post("https://api.frdic.com/api/open/v1/studylist/word",{language:u,word:a,context_line:t||"",category_ids:[p]},{headers:m})}catch(e){throw console.error(`[Eudic] Failed to add word "${a}" to study list (category: ${p}):`,null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,JSON.stringify(null!==(d=null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.data)&&void 0!==d?d:e)),e}}catch(e){console.error("[Eudic] Sync error for word:",a,null===(c=null==e?void 0:e.response)||void 0===c?void 0:c.status,JSON.stringify(null!==(m=null===(u=null==e?void 0:e.response)||void 0===u?void 0:u.data)&&void 0!==m?m:e))}})),this.syncWordToAnki=(a,t,o,i,n="")=>m(this,void 0,void 0,(function*(){var r,l,s,d,c,u,m,p,h,g;if("yes"===this.configService.getReaderConfig("isEnableAnkiSync"))try{let h;try{h=this.configService.getObjectConfig("ankiSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[Anki] Failed to read ankiSyncConfig:",JSON.stringify(e))}if(!h||!h.deckName)return void console.error("[Anki] Sync skipped: config is missing or deckName is not set",JSON.stringify({hasConfig:!!h}));const g=h.host||"127.0.0.1",f=`http://${g}:${h.port||"8765"}`,y=h.deckName,N="Koodo Reader Word",v=(a,t={})=>{const o={action:a,version:6,params:t};return h.apiKey&&(o.key=h.apiKey),e.post(f,o)};if(!h.modelName)try{const e=yield v("modelNames");if(!((null===(r=e.data)||void 0===r?void 0:r.result)||[]).includes(N))try{yield v("createModel",{modelName:N,inOrderFields:["Word","Sentence","Book","Chapter","Definition"],cardTemplates:[{Name:"Card 1",Front:"{{Word}}

{{Sentence}}

{{Book}}
{{Chapter}}",Back:"{{Definition}}"}]})}catch(e){throw console.error(`[Anki] Failed to create model "${N}":`,JSON.stringify(null!==(s=null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.data)&&void 0!==s?s:e)),e}this.configService.setObjectConfig("ankiSyncConfig",Object.assign(Object.assign({},h),{modelName:N}),"thirdpartyToken")}catch(e){throw console.error(`[Anki] Failed to fetch model names from ${f}:`,JSON.stringify(null!==(c=null===(d=null==e?void 0:e.response)||void 0===d?void 0:d.data)&&void 0!==c?c:e)),e}try{const e=yield v("addNote",{note:{deckName:y,modelName:N,fields:{Word:a,Sentence:t||"",Book:o||"",Chapter:i||"",Definition:n||""},options:{allowDuplicate:!1},tags:[]}});(null===(u=e.data)||void 0===u?void 0:u.error)&&console.error(`[Anki] addNote returned an error for word "${a}" in deck "${y}":`,JSON.stringify(e.data.error))}catch(e){throw console.error(`[Anki] Failed to add note for word "${a}" to deck "${y}" at ${f}:`,JSON.stringify(null!==(p=null===(m=null==e?void 0:e.response)||void 0===m?void 0:m.data)&&void 0!==p?p:e)),e}}catch(e){console.error("[Anki] Sync error for word:",a,JSON.stringify(null!==(g=null===(h=null==e?void 0:e.response)||void 0===h?void 0:h.data)&&void 0!==g?g:e))}})),this.syncWordToMaiMemo=a=>m(this,void 0,void 0,(function*(){var t,o,i,n,r,l,s,d,c,u,m,p,h,g,f,y,N,v,b,k;if("yes"===this.configService.getReaderConfig("isEnableMaiMemoSync"))try{let v;try{v=this.configService.getObjectConfig("maimemoSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[MaiMemo] Failed to read maimemoSyncConfig:",JSON.stringify(e))}if(!v||!v.accessToken||!v.notepadName)return void console.error("[MaiMemo] Sync skipped: config is missing accessToken or notepadName",JSON.stringify({hasConfig:!!v}));const b=v.accessToken,k=v.notepadName.trim(),S={Authorization:`Bearer ${b}`,"Content-Type":"application/json",Accept:"application/json"};let E=v.notepadId||"";if(!E)try{const l=yield e.get("https://open.maimemo.com/open/api/v1/memo/notepads",{headers:S}),s=((null===(o=null===(t=l.data)||void 0===t?void 0:t.data)||void 0===o?void 0:o.notepads)||[]).find((e=>"PUBLISHED"===e.status&&e.title===k));if(s)E=s.id;else{if(E=null===(r=null===(n=null===(i=(yield e.post("https://open.maimemo.com/open/api/v1/memo/notepads",{notepad:{status:"PUBLISHED",content:a,title:k,brief:k,tags:[]}},{headers:S})).data)||void 0===i?void 0:i.data)||void 0===n?void 0:n.notepad)||void 0===r?void 0:r.id,!E)return void console.error("[MaiMemo] Created notepad but no id returned")}this.configService.setObjectConfig("maimemoSyncConfig",Object.assign(Object.assign({},v),{notepadId:E}),"thirdpartyToken")}catch(e){return void console.error("[MaiMemo] Failed to resolve notepadId:",null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,JSON.stringify(null!==(d=null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.data)&&void 0!==d?d:e))}try{let t="";try{t=(null===(m=null===(u=null===(c=(yield e.get(`https://open.maimemo.com/open/api/v1/memo/notepads/${E}`,{headers:S})).data)||void 0===c?void 0:c.data)||void 0===u?void 0:u.notepad)||void 0===m?void 0:m.content)||""}catch(e){return void console.error("[MaiMemo] Failed to fetch notepad content:",null===(p=null==e?void 0:e.response)||void 0===p?void 0:p.status,JSON.stringify(null!==(g=null===(h=null==e?void 0:e.response)||void 0===h?void 0:h.data)&&void 0!==g?g:e))}const o=t.split("\n").map((e=>e.trim())).filter((e=>e.length>0));if(o.includes(a))return;o.push(a),yield e.post(`https://open.maimemo.com/open/api/v1/memo/notepads/${E}`,{id:E,notepad:{status:"PUBLISHED",content:o.join("\n"),title:k,brief:k,tags:[]}},{headers:S})}catch(e){throw console.error(`[MaiMemo] Failed to add word "${a}" to notepad "${k}" (${E}):`,null===(f=null==e?void 0:e.response)||void 0===f?void 0:f.status,JSON.stringify(null!==(N=null===(y=null==e?void 0:e.response)||void 0===y?void 0:y.data)&&void 0!==N?N:e)),e}}catch(e){console.error("[MaiMemo] Sync error for word:",a,null===(v=null==e?void 0:e.response)||void 0===v?void 0:v.status,JSON.stringify(null!==(k=null===(b=null==e?void 0:e.response)||void 0===b?void 0:b.data)&&void 0!==k?k:e))}})),this.configService=a}}class Ye extends Qe{}export{S as CommonTool,ze as ConfigService,Be as HighlightUtil,Ae as KOReaderUtil,A as KookitConfig,ye as LoginHelper,Ge as NoteSyncManager,he as ReaderRequest,ve as ReadingTimeUtil,ce as SqlStatement,Ne as SyncHelper,oe as SyncUtil,ge as ThirdpartyRequest,fe as UserRequest,Ye as WordSyncManager}; +import e from"axios";import{Storage as a}from"megajs";import{Buffer as t}from"buffer";import{S3Client as o,ListObjectsV2Command as i,DeleteObjectCommand as n,PutObjectCommand as r,GetObjectCommand as l}from"@aws-sdk/client-s3";import s from"crypto-js";import{AuthType as d,createClient as c}from"webdav/dist/web/index.js";import{SSE as u}from"sse.js";function m(e,a,t,o){return new(t||(t=Promise))((function(i,n){function r(e){try{s(o.next(e))}catch(e){n(e)}}function l(e){try{s(o.throw(e))}catch(e){n(e)}}function s(e){var a;e.done?i(e.value):(a=e.value,a instanceof t?a:new t((function(e){e(a)}))).then(r,l)}s((o=o.apply(e,a||[])).next())}))}const p=e=>"json"===e?"application/json":["jpg","jpeg","png","gif","bmp"].includes(e)?"image/"+e:"zip"===e?"application/zip":"epub"===e?"application/epub+zip":"txt"===e?"text/plain":"pdf"===e?"application/pdf":"mobi"===e?"application/x-mobipocket-ebook":"azw3"===e||"azw"===e?"application/vnd.amazon.ebook":"cbz"===e?"application/x-cbz":"cbr"===e?"application/x-cbr":"cbt"===e?"application/x-cbt":"cb7"===e?"application/x-cb7":"fb2"===e?"application/x-fictionbook+xml":"html"===e?"text/html":"css"===e?"text/css":"js"===e?"application/javascript":"xml"===e?"application/xml":"xhtml"===e?"application/xhtml+xml":"opf"===e?"application/oebps-package+xml":"ncx"===e?"application/x-dtbncx+xml":"mp3"===e?"audio/mpeg":"wav"===e?"audio/wav":"ogg"===e?"audio/ogg":"mp4"===e?"video/mp4":"webm"===e?"video/webm":"avi"===e?"video/x-msvideo":"wmv"===e?"video/x-ms-wmv":"flv"===e?"video/x-flv":"m3u8"===e?"application/x-mpegURL":"ts"===e?"video/MP2T":"3gp"===e?"video/3gpp":"3g2"===e?"video/3gpp2":"db"===e?"application/x-sqlite3":void 0,h=["books","notes","bookmarks","plugins","words"],g=e=>{const a=atob(e),t=a.length,o=new Uint8Array(t);for(let e=0;e{let a="";const t=new Uint8Array(e),o=t.byteLength;for(let e=0;ee.toString(16).padStart(2,"0"))).join("")}))}function N(e){const a=[1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298],t=(e,a)=>e>>>a|e<<32-a,o=(e,a,t)=>e&a^~e&t,i=(e,a,t)=>e&a^e&t^a&t,n=e=>t(e,2)^t(e,13)^t(e,22),r=e=>t(e,6)^t(e,11)^t(e,25),l=e=>t(e,7)^t(e,18)^e>>>3,s=[1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225],d=8*e.length,c=(960-(8*e.length+1)%512)%512,u=e.length+Math.ceil((c+1)/8)+8,m=new Uint8Array(u);m.set(e),m[e.length]=128;new DataView(m.buffer,m.byteLength-8).setBigUint64(0,BigInt(d),!1);for(let e=0;e>>10)+c[e-7]+l(c[e-15])+c[e-16]>>>0);let[u,h,g,f,y,N,v,b]=s;for(let e=0;e<64;e++){const t=b+r(y)+o(y,N,v)+a[e]+c[e]>>>0,l=n(u)+i(u,h,g)>>>0;b=v,v=N,N=y,y=f+t>>>0,f=g,g=h,h=u,u=t+l>>>0}s[0]=s[0]+u>>>0,s[1]=s[1]+h>>>0,s[2]=s[2]+g>>>0,s[3]=s[3]+f>>>0,s[4]=s[4]+y>>>0,s[5]=s[5]+N>>>0,s[6]=s[6]+v>>>0,s[7]=s[7]+b>>>0}var p;const h=new ArrayBuffer(32),g=new DataView(h);return s.forEach(((e,a)=>{g.setUint32(4*a,e,!1)})),h}const v={_chars:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",encode(e){if("string"!=typeof e)throw new Error("Input must be a string");let a="",t=0;const o=this._stringToUtf8Bytes(e),i=o.length;for(;t>2,s=(3&e)<<4|n>>4,d=(15&n)<<2|r>>6,c=63&r;a+=this._chars.charAt(l),a+=this._chars.charAt(s),a+=t-2>=i?"=":this._chars.charAt(d),a+=t-1>=i?"=":this._chars.charAt(c)}return a},decode(e){if("string"!=typeof e)throw new Error("Input must be a string");for(e=e.replace(/[^A-Za-z0-9+/]/g,"");e.length%4!=0;)e+="=";const a=[];let t=0;const o=e.length;for(;t>4,s=(15&i)<<4|n>>2,d=(3&n)<<6|r;a.push(l),-1!==n&&a.push(s),-1!==r&&a.push(d)}return this._utf8BytesToString(a)},_stringToUtf8Bytes(e){const a=[];for(let t=0;t>6),a.push(128|63&o);else if(55296==(64512&o)&&t+1>18),a.push(128|e>>12&63),a.push(128|e>>6&63),a.push(128|63&e)}else a.push(239,191,189),t--}else a.push(224|o>>12),a.push(128|o>>6&63),a.push(128|63&o)}return a},_utf8BytesToString(e){let a="",t=0;for(;t65535){const t=e-65536;a+=String.fromCharCode(55296|t>>10),a+=String.fromCharCode(56320|1023&t)}else a+=String.fromCharCode(e)}else a+="�"}else a+="�"}return a},encodeURL(e){return this.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")},decodeURL(e){for(e=e.replace(/-/g,"+").replace(/_/g,"/");e.length%4;)e+="=";return this.decode(e)}},b=e=>{const a=(e,a)=>{const t=(65535&e)+(65535&a);return(e>>16)+(a>>16)+(t>>16)<<16|65535&t},t=(e,t,o,i,n,r)=>{return a((l=a(a(t,e),a(i,r)))<<(s=n)|l>>>32-s,o);var l,s},o=(e,a,o,i,n,r,l)=>t(a&o|~a&i,e,a,n,r,l),i=(e,a,o,i,n,r,l)=>t(a&i|o&~i,e,a,n,r,l),n=(e,a,o,i,n,r,l)=>t(a^o^i,e,a,n,r,l),r=(e,a,o,i,n,r,l)=>t(o^(a|~i),e,a,n,r,l),l=e.length,s=1+(l+8>>6),d=new Array(16*s).fill(0);for(let a=0;a>2]|=e[a]<>2]|=128<{let a="";for(let t=0;t<4;t++)a+=("0"+(e>>8*t&255).toString(16)).slice(-2);return a})).join("")};class k{constructor(e){this.queue=[],this.runningTasks=0,this.totalTasks=0,this.completedTasks=0,this.hasFailedTasks=!1,this.downloadedSize=0,this.maxConcurrency=e}addTask(e){return m(this,void 0,void 0,(function*(){return this.totalTasks++,new Promise(((a,t)=>{if(this.hasFailedTasks)return void a(void 0);const o=()=>m(this,void 0,void 0,(function*(){if(this.hasFailedTasks)return this.completedTasks++,void a(void 0);try{this.runningTasks++;const t=yield e();return this.completedTasks++,a(t),t}catch(e){throw this.completedTasks++,t(e),e}finally{this.runningTasks--,this.runNext()}}));this.runningTasks0;){const e=this.queue.shift();e&&e()}else if(this.queue.length>0&&this.runningTasks"application/json"===e?"json":e.startsWith("image/")?e.split("/")[1]:"application/zip"===e?"zip":"application/epub+zip"===e?"epub":"text/plain"===e?"txt":"application/pdf"===e?"pdf":"application/x-mobipocket-ebook"===e?"mobi":"application/vnd.amazon.ebook"===e?"azw3":"application/x-cbz"===e?"cbz":"application/x-cbr"===e?"cbr":"application/x-cbt"===e?"cbt":"application/x-cb7"===e?"cb7":"application/x-fictionbook+xml"===e?"fb2":"text/html"===e?"html":"text/css"===e?"css":"application/javascript"===e?"js":"application/xml"===e?"xml":"application/xhtml+xml"===e?"xhtml":"application/oebps-package+xml"===e?"opf":"application/x-dtbncx+xml"===e?"ncx":"audio/mpeg"===e?"mp3":"audio/wav"===e?"wav":"audio/ogg"===e?"ogg":"video/mp4"===e?"mp4":"video/webm"===e?"webm":"video/x-msvideo"===e?"avi":"video/x-ms-wmv"===e?"wmv":"video/x-flv"===e?"flv":"application/x-mpegURL"===e?"m3u8":"video/MP2T"===e?"ts":"video/3gpp"===e?"3gp":"video/3gpp2"===e?"3g2":"application/x-sqlite3"===e?"db":"",databaseList:h,configList:["themeColors","readingTime","appVersion","cloudSyncTime","lastSyncTime","recentBooks","koreaderBooks","recentAdd","deletedBooks","favoriteBooks","shelfList","txtParsers","aiModelConfig","readingStats","noteTags","recordLocation","thirdpartyToken","sortedShelfList","kindleDeviceList","thirdpartyToken","opdsCatalogs","opdsCatalogList"],copyArrayBuffer:e=>{var a=new ArrayBuffer(e.byteLength);return new Uint8Array(a).set(new Uint8Array(e)),a},base64ToArrayBuffer:g,arrayBufferToBase64:f,generateSHA256Hash:y,simpleEncrypt:function(e,a){if(!e||!a)return"";const t=N((new TextEncoder).encode(a)),o=Array.from(new Uint8Array(t)),i=(new TextEncoder).encode(e),n=new Uint8Array(i.length);for(let e=0;e{const a=new Set(["anthropic","zhipu","doubao","moonshot","deepseek","minimax","minimaxi"]),t=new Set(["qwen","hunyuan","siliconflow","siliconflowglobal","infini"]),o=new Set(["sensenova","openai"]),i=new Set(["ollama"]);return e&&"custom"!==e?a.has(e)?{thinking:{type:"disabled"}}:t.has(e)?{enable_thinking:!1}:o.has(e)?{reasoning_effort:"none"}:i.has(e)?{think:!1}:{}:{}},EmailProviders:["gmail.com","qq.com","163.com","yahoo.com","sina.com","sina.cn","126.com","outlook.com","yeah.net","foxmail.com","hotmail.com","protonmail.com","proton.me","icloud.com","mail.com","live.com","live.cn","msn.cn","msn.com","aliyun.com","sohu.com","yandex.com","naver.com","mail.ru","yahoo.co.jp","139.com","189.com","yandex.ru","189.cn"],Base64:v};const E={cloudUrl:"https://cloud.koodoreader.com",cloudCNUrl:"https://cloud.koodoreader.cn",testUrl:"https://cloudtestv2.960960.xyz",devUrl:"http://192.168.28.159:8000"},C={callbackUrl:"https://web.koodoreader.com/",cnCallbackUrl:"https://web.koodoreader.cn/",dropboxClientId:"vnc67byrssocvy1",yandexClientId:"e5305b62f53844b1994f77a840fd0a37",pcloudClientId:"pg8ten0B3vH",boxClientId:"ltimecqanmpxoaicn9qw3es6l3sdl1ya",duboxClientId:"kc0Ls6xLZugGgLLVhZ8yhUU1cRkRoKNU",yiyiwuClientId:"100197197",microsoftClientId:"506df58a-29ab-4020-afc5-6f423dc80f35",googleClientId:"1051055003225-ph1f5fvh328dhv7bco5jitlnfhg6ks2t.apps.googleusercontent.com",appleClientId:"com.koodoreader.auth",facebookClientId:"2845583825559500",githubClientId:"Ov23liJVzfvJMMEEZ8v2",adriveClientId:"a128ae7b9c094545af623de61dc0a1ef"},T={google:{clientId:C.googleClientId,scopes:["openid email profile"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"openid email profile"}},microsoft:{clientId:C.microsoftClientId,scopes:["openid","profile","User.Read","offline_access"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"openid profile User.Read offline_access"}},facebook:{clientId:C.facebookClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:""}},github:{clientId:C.githubClientId,scopes:["user:email"],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"user:email"}},apple:{clientId:C.appleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{}},email:{clientId:"",scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:""}}},w=["backgroundColor","textColor","fontSize","margin","letterSpacing","paraSpacing","scale","brightness","fontFamily","subFontFamily","lineHeight","textAlign","textOrientation","convertChinese","selectAction","fullTranslationMode","readerMode","pdfReaderMode","isBold","isIndent","isSliding","isUnderline","isShadow","isItalic","isInvert","isBionic","isHyphenation","isOrphanWidow","isKeepPDFBackground","isAllowScript","isStartFromEven"];var A={CloudMode:"test",CloudConfig:E,ConvertLangMap:{en:"English",zhCN:"Chinese",zhTW:"Chinese",zhMO:"Chinese",tr:"Turkish",ar:"Arabic",ro:"Romanian",pl:"Polish",cs:"Czech",ja:"Japanese",ta:"Tamil",uk:"Ukrainian",sl:"Slovenian",bo:"Tibetan",id:"Indonesian",hy:"Armenian",el:"Greek",hu:"Hungarian",hi:"Hindi",bg:"Bulgarian",nl:"Dutch",it:"Italian",bn:"Bengali",tl:"Tagalog",sv:"Swedish",ga:"Irish",ko:"Korean",de:"German",ru:"Russian",es:"Spanish",fr:"French",fa:"Persian",ptBR:"Portuguese",th:"Thai",sr:"Serbian",am:"Amharic",da:"Danish",fi:"Finnish",ie:"Interlingue",pt:"Portuguese",vi:"Vietnamese"},ContentRegxConfig:[{label:"Default parser",value:"Default parser",subtitle:"Suitable for most txt files",regex:""},{label:"Chinese novel parser",value:"Chinese novel parser",subtitle:"Suitable for most Chinese novels, eg. 第一章,第2回",regex:"^\\s*(第[0-9一二三四五六七八九十百千万零壹贰叁肆伍陆柒捌玖拾佰仟]+[章回])\\s*"},{label:"English novel parser",value:"English novel parser",subtitle:"Suitable for most English novels, eg. Chapter 1, Part II",regex:"^\\s*(Chapter|Part|Book|CHAPTER|PART|BOOK)\\s*"},{label:"Number parser",value:"Number parser",subtitle:"Suitable for novels with number chapter titles, eg. 1, 2, 3",regex:"^\\s*([0-9]+[\\s.、::·\\-—]+|[一二三四五六七八九十百千万零]+[\\s.、::·\\-—]+).+"}],StyleKeys:w,ThirdpartyConfig:C,LoginAuthRequest:T,LoginDiscovery:{microsoft:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"},facebook:{authorizationEndpoint:"https://www.facebook.com/v12.0/dialog/oauth",tokenEndpoint:"https://graph.facebook.com/v12.0/oauth/access_token"},github:{authorizationEndpoint:"https://github.com/login/oauth/authorize",tokenEndpoint:"https://github.com/login/oauth/access_token"},apple:{authorizationEndpoint:"https://appleid.apple.com/auth/authorize",tokenEndpoint:"https://appleid.apple.com/auth/token"},email:{authorizationEndpoint:"",tokenEndpoint:""}},DriveAuthRequest:{dropbox:{clientId:C.dropboxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{token_access_type:"offline"}},yandex:{clientId:C.yandexClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code",force_confirm:"true"}},boxnet:{clientId:C.boxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}},pcloud:{clientId:C.pcloudClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code"}},dubox:{clientId:C.duboxClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code",scope:"basic,netdisk",device_id:"119827642",qrcode:"1"}},yiyiwu:{clientId:C.yiyiwuClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{response_type:"code"}},adrive:{clientId:C.adriveClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}},microsoft:{clientId:C.microsoftClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"files.readwrite.appfolder offline_access"}},google:{clientId:C.googleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"https://www.googleapis.com/auth/drive.file",access_type:"offline"}},microsoft_exp:{clientId:C.microsoftClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{scope:"files.readwrite.all offline_access"}},google_exp:{clientId:C.googleClientId,scopes:[],usePKCE:!1,responseType:"code",redirectUri:C.callbackUrl,extraParams:{prompt:"consent",scope:"https://www.googleapis.com/auth/drive",access_type:"offline"}}},DriveDiscovery:{dropbox:{authorizationEndpoint:"https://www.dropbox.com/oauth2/authorize",tokenEndpoint:"https://www.dropbox.com/oauth2/token"},yandex:{authorizationEndpoint:"https://oauth.yandex.com/authorize",tokenEndpoint:"https://oauth.yandex.com/token"},boxnet:{authorizationEndpoint:"https://account.box.com/api/oauth2/authorize",tokenEndpoint:"https://api.box.com/oauth2/token"},pcloud:{authorizationEndpoint:"https://my.pcloud.com/oauth2/authorize",tokenEndpoint:"https://api.pcloud.com/oauth2_token"},dubox:{authorizationEndpoint:"https://openapi.baidu.com/oauth/2.0/authorize",tokenEndpoint:"https://openapi.baidu.com/oauth/2.0/token"},yiyiwu:{authorizationEndpoint:"https://passportapi.115.com/open/authorize",tokenEndpoint:"https://passportapi.115.com/open/authorize"},adrive:{authorizationEndpoint:"https://openapi.alipan.com/oauth/authorize",tokenEndpoint:"https://openapi.alipan.com/oauth/token"},microsoft:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"},microsoft_exp:{authorizationEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/authorize",tokenEndpoint:"https://login.microsoftonline.com/common/oauth2/v2.0/token"},google_exp:{authorizationEndpoint:"https://accounts.google.com/o/oauth2/v2/auth",tokenEndpoint:"https://oauth2.googleapis.com/token"}},AiProviderList:[{id:"custom",name:"Custom model",defaultEndpoint:"",modelsEndpoint:"",isCNAvailable:!0},{id:"openai",name:"OpenAI",defaultEndpoint:"https://api.openai.com/v1",modelsEndpoint:"https://api.openai.com/v1/models"},{id:"anthropic",name:"Anthropic",defaultEndpoint:"https://api.anthropic.com/v1",modelsEndpoint:"https://api.anthropic.com/v1/models"},{id:"google",name:"Google Gemini",defaultEndpoint:"https://generativelanguage.googleapis.com/v1beta/openai",modelsEndpoint:"https://generativelanguage.googleapis.com/v1beta/openai/models"},{id:"deepseek",name:"DeepSeek",defaultEndpoint:"https://api.deepseek.com/v1",modelsEndpoint:"https://api.deepseek.com/v1/models",isCNAvailable:!0},{id:"mistral",name:"Mistral AI",defaultEndpoint:"https://api.mistral.ai/v1",modelsEndpoint:"https://api.mistral.ai/v1/models"},{id:"cohere",name:"Cohere",defaultEndpoint:"https://api.cohere.ai/compatibility/v1",modelsEndpoint:"https://api.cohere.ai/compatibility/v1/models"},{id:"groq",name:"Groq",defaultEndpoint:"https://api.groq.com/openai/v1",modelsEndpoint:"https://api.groq.com/openai/v1/models"},{id:"together",name:"Together AI",defaultEndpoint:"https://api.together.xyz/v1",modelsEndpoint:"https://api.together.xyz/v1/models"},{id:"fireworks",name:"Fireworks AI",defaultEndpoint:"https://api.fireworks.ai/inference/v1",modelsEndpoint:"https://api.fireworks.ai/inference/v1/models"},{id:"perplexity",name:"Perplexity",defaultEndpoint:"https://api.perplexity.ai",modelsEndpoint:"https://api.perplexity.ai/v1/models"},{id:"openrouter",name:"OpenRouter",defaultEndpoint:"https://openrouter.ai/api/v1",modelsEndpoint:"https://openrouter.ai/api/v1/models"},{id:"ai21",name:"AI21 Labs",defaultEndpoint:"https://api.ai21.com/studio/v1",modelsEndpoint:"https://api.ai21.com/studio/v1/models"},{id:"xai",name:"xAI (Grok)",defaultEndpoint:"https://api.x.ai/v1",modelsEndpoint:"https://api.x.ai/v1/models"},{id:"sambanova",name:"SambaNova",defaultEndpoint:"https://api.sambanova.ai/v1",modelsEndpoint:"https://api.sambanova.ai/v1/models"},{id:"cerebras",name:"Cerebras",defaultEndpoint:"https://api.cerebras.ai/v1",modelsEndpoint:"https://api.cerebras.ai/v1/models"},{id:"hyperbolic",name:"Hyperbolic",defaultEndpoint:"https://api.hyperbolic.xyz/v1",modelsEndpoint:"https://api.hyperbolic.xyz/v1/models"},{id:"novita",name:"Novita AI",defaultEndpoint:"https://api.novita.ai/openai",modelsEndpoint:"https://api.novita.ai/openai/models"},{id:"lepton",name:"Lepton AI",defaultEndpoint:"https://llm.lepton.run/api/v1",modelsEndpoint:"https://llm.lepton.run/api/v1/models"},{id:"deepinfra",name:"DeepInfra",defaultEndpoint:"https://api.deepinfra.com/v1/openai",modelsEndpoint:"https://api.deepinfra.com/v1/openai/models"},{id:"replicate",name:"Replicate",defaultEndpoint:"https://api.replicate.com/v1",modelsEndpoint:"https://api.replicate.com/v1/models"},{id:"zhipu",name:"Zhipu AI (智谱)",defaultEndpoint:"https://open.bigmodel.cn/api/paas/v4",modelsEndpoint:"https://open.bigmodel.cn/api/paas/v4/models",isCNAvailable:!0},{id:"qwen",name:"Alibaba Qwen (通义千问)",defaultEndpoint:"https://dashscope.aliyuncs.com/compatible-mode/v1",modelsEndpoint:"https://dashscope.aliyuncs.com/compatible-mode/v1/models",isCNAvailable:!0},{id:"moonshot",name:"Moonshot (月之暗面)",defaultEndpoint:"https://api.moonshot.cn/v1",modelsEndpoint:"https://api.moonshot.cn/v1/models",isCNAvailable:!0},{id:"baidu",name:"Baidu ERNIE (文心一言)",defaultEndpoint:"https://qianfan.baidubce.com/v2",modelsEndpoint:"https://qianfan.baidubce.com/v2/models",isCNAvailable:!0},{id:"doubao",name:"Volcengine Doubao (豆包)",defaultEndpoint:"https://ark.cn-beijing.volces.com/api/v3",modelsEndpoint:"https://ark.cn-beijing.volces.com/api/v3/models",isCNAvailable:!0},{id:"spark",name:"iFlytek Spark (讯飞星火)",defaultEndpoint:"https://spark-api-open.xf-yun.com/v1",modelsEndpoint:"https://spark-api-open.xf-yun.com/v1/models",isCNAvailable:!0},{id:"hunyuan",name:"Tencent Hunyuan (腾讯混元)",defaultEndpoint:"https://api.hunyuan.cloud.tencent.com/v1",modelsEndpoint:"https://api.hunyuan.cloud.tencent.com/v1/models",isCNAvailable:!0},{id:"minimaxi",name:"MiniMax (国内版)",defaultEndpoint:"https://api.minimaxi.com/v1",modelsEndpoint:"https://api.minimaxi.com/v1/models",isCNAvailable:!0},{id:"minimax",name:"MiniMax (国际版)",defaultEndpoint:"https://api.minimax.io/v1",modelsEndpoint:"https://api.minimax.io/v1/models"},{id:"baichuan",name:"Baichuan (百川)",defaultEndpoint:"https://api.baichuan-ai.com/v1",modelsEndpoint:"https://api.baichuan-ai.com/v1/models",isCNAvailable:!0},{id:"stepfun",name:"StepFun (阶跃星辰)",defaultEndpoint:"https://api.stepfun.com/v1",modelsEndpoint:"https://api.stepfun.com/v1/models",isCNAvailable:!0},{id:"lingyi",name:"Lingyiwanwu (零一万物)",defaultEndpoint:"https://api.lingyiwanwu.com/v1",modelsEndpoint:"https://api.lingyiwanwu.com/v1/models",isCNAvailable:!0},{id:"siliconflow",name:"SiliconFlow (硅基流动)",defaultEndpoint:"https://api.siliconflow.cn/v1",modelsEndpoint:"https://api.siliconflow.cn/v1/models",isCNAvailable:!0},{id:"siliconflowglobal",name:"SiliconFlow (国际版)",defaultEndpoint:"https://api.siliconflow.com/v1",modelsEndpoint:"https://api.siliconflow.com/v1/models"},{id:"sensenova",name:"SenseNova (日日新)",defaultEndpoint:"https://token.sensenova.cn/v1",modelsEndpoint:"https://token.sensenova.cn/v1/models",isCNAvailable:!0},{id:"infini",name:"Infini AI (无问芯穹)",defaultEndpoint:"https://cloud.infini-ai.com/maas/v1",modelsEndpoint:"https://cloud.infini-ai.com/maas/v1/models",isCNAvailable:!0},{id:"ollama",name:"Ollama (Local)",defaultEndpoint:"http://localhost:11434/v1",modelsEndpoint:"http://localhost:11434/v1/models",isCNAvailable:!0},{id:"lmstudio",name:"LM Studio (Local)",defaultEndpoint:"http://localhost:1234/v1",modelsEndpoint:"http://localhost:1234/v1/models",isCNAvailable:!0},{id:"vllm",name:"vLLM (Local)",defaultEndpoint:"http://localhost:8000/v1",modelsEndpoint:"http://localhost:8000/v1/models",isCNAvailable:!0},{id:"azure",name:"Azure OpenAI",defaultEndpoint:"",modelsEndpoint:""},{id:"aws_bedrock",name:"AWS Bedrock",defaultEndpoint:"",modelsEndpoint:""}],DefaultPrompts:{aiTranslate:"You are a professional translator. Translate the following text from {from} to {to}. Only return the translated text, no explanations.\n\nText: {text}",aiDict:"You are a professional dictionary assistant. Analyze the word or phrase: {word}\nProvide a comprehensive explanation including pronunciation, definitions, example sentences, and usage notes using {to} as the target language. ",aiAssistance:"You are a helpful reading assistant. The user is reading a book. Here is the context:\n{text}\n\nAnswer the user's question concisely and helpfully, and reply with the same language."},SpeechList:[{label:"English",code:"en",example:"To be, or not to be, that is the question."},{label:"Simplified Chinese",code:"zh",example:"千里之行,始于足下。"},{label:"Japanese",code:"ja",example:"猿も木から落ちる。"},{label:"Korean",code:"ko",example:"가는 날이 장날이다."},{label:"French",code:"fr",example:"Liberté, égalité, fraternité."},{label:"German",code:"de",example:"Der Weg ist das Ziel."},{label:"Spanish",code:"es",example:"La vida es un sueño."},{label:"Italian",code:"it",example:"Dolce far niente."},{label:"Russian",code:"ru",example:"Век живи, век учись."},{label:"Portuguese",code:"pt",example:"Saudade é um sentimento profundo."},{label:"Hindi",code:"hi",example:"सपने वो नहीं जो हम सोते वक्त देखते हैं।"},{label:"Afrikaans",code:"af",example:"Die lewe is 'n geskenk."},{label:"Amharic",code:"am",example:"ዕውቀት ብርሃን ነው።"},{label:"Arabic",code:"ar",example:"العلم نور والجهل ظلام."},{label:"Azerbaijani",code:"az",example:"Elm işıqdır, cəhalət zülmət."},{label:"Bulgarian",code:"bg",example:"Знанието е сила."},{label:"Bengali",code:"bn",example:"জ্ঞানই শক্তি।"},{label:"Bosnian",code:"bs",example:"Znanje je moć."},{label:"Catalan",code:"ca",example:"El saber no ocupa lloc."},{label:"Czech",code:"cs",example:"Bez práce nejsou koláče."},{label:"Welsh",code:"cy",example:"Nid aur popeth melyn."},{label:"Danish",code:"da",example:"Lykken er ikke et sted, men en retning."},{label:"Greek",code:"el",example:"Η γνώση είναι δύναμη."},{label:"Estonian",code:"et",example:"Teadmine on jõud."},{label:"Basque",code:"eu",example:"Jakitea boterea da."},{label:"Persian",code:"fa",example:"دانش قدرت است."},{label:"Finnish",code:"fi",example:"Tieto on valtaa."},{label:"Filipino",code:"fil",example:"Ang kaalaman ay kapangyarihan."},{label:"Irish",code:"ga",example:"Is fearr Gaeilge briste ná Béarla cliste."},{label:"Galician",code:"gl",example:"O saber non ocupa lugar."},{label:"Gujarati",code:"gu",example:"જ્ઞાન શક્તિ છે."},{label:"Hebrew",code:"he",example:"ידע הוא כוח."},{label:"Croatian",code:"hr",example:"Znanje je moć."},{label:"Hungarian",code:"hu",example:"A tudás hatalom."},{label:"Armenian",code:"hy",example:"Գիտելիքը ուժ է."},{label:"Indonesian",code:"id",example:"Pengetahuan adalah kekuatan."},{label:"Icelandic",code:"is",example:"Þekking er máttur."},{label:"Inuktitut",code:"iu",example:"ᐃᓕᓐᓂᐊᕐᓂᖅ ᐱᒻᒪᕆᐅᕗᖅ."},{label:"Javanese",code:"jv",example:"Ilmu iku kelakone kanthi laku."},{label:"Georgian",code:"ka",example:"ცოდნა ძალაა."},{label:"Kazakh",code:"kk",example:"Білім — күш."},{label:"Khmer",code:"km",example:"ចំណេះដឹងគឺជាអំណាច។"},{label:"Kannada",code:"kn",example:"ಜ್ಞಾನವೇ ಶಕ್ತಿ."},{label:"Lao",code:"lo",example:"ຄວາມຮູ້ຄືພະລັງ."},{label:"Lithuanian",code:"lt",example:"Žinios yra jėga."},{label:"Latvian",code:"lv",example:"Zināšanas ir spēks."},{label:"Macedonian",code:"mk",example:"Знаењето е моќ."},{label:"Malayalam",code:"ml",example:"അറിവ് ശക്തിയാണ്."},{label:"Mongolian",code:"mn",example:"Мэдлэг бол хүч."},{label:"Marathi",code:"mr",example:"ज्ञान हीच शक्ती आहे."},{label:"Malay",code:"ms",example:"Ilmu itu cahaya."},{label:"Maltese",code:"mt",example:"L-għarfien huwa l-poter."},{label:"Burmese",code:"my",example:"ဗဟုသုတသည် အားဖြစ်သည်။"},{label:"Norwegian",code:"nb",example:"Kunnskap er makt."},{label:"Nepali",code:"ne",example:"ज्ञान नै शक्ति हो।"},{label:"Dutch",code:"nl",example:"Kennis is macht."},{label:"Odia",code:"or",example:"ଜ୍ଞାନ ହିଁ ଶକ୍ତି।"},{label:"Punjabi",code:"pa",example:"ਗਿਆਨ ਹੀ ਸ਼ਕਤੀ ਹੈ।"},{label:"Polish",code:"pl",example:"Wiedza to potęga."},{label:"Pashto",code:"ps",example:"د پوهې ډیوه روښانه ده."},{label:"Romanian",code:"ro",example:"Cartea este o comoară."},{label:"Sinhala",code:"si",example:"දැනුම බලයකි."},{label:"Slovak",code:"sk",example:"Vedomosti sú sila."},{label:"Slovenian",code:"sl",example:"Znanje je moč."},{label:"Somali",code:"so",example:"Aqoontu waa iftiin."},{label:"Albanian",code:"sq",example:"Dija është fuqi."},{label:"Serbian",code:"sr",example:"Знање је моћ."},{label:"Sundanese",code:"su",example:"Élmu éta cahaya."},{label:"Swedish",code:"sv",example:"Kunskap är makt."},{label:"Swahili",code:"sw",example:"Maarifa ni nguvu."},{label:"Tamil",code:"ta",example:"அறிவே ஆற்றல்."},{label:"Telugu",code:"te",example:"జ్ఞానమే శక్తి."},{label:"Thai",code:"th",example:"ความรู้คือพลัง."},{label:"Turkish",code:"tr",example:"Bilgi güçtür."},{label:"Ukrainian",code:"uk",example:"Знання — сила."},{label:"Urdu",code:"ur",example:"علم ہی طاقت ہے۔"},{label:"Uzbek",code:"uz",example:"Bilim – kuch."},{label:"Vietnamese",code:"vi",example:"Học vấn là sức mạnh."},{label:"Wu Chinese",code:"wuu",example:"学问是力量。"},{label:"Cantonese",code:"yue",example:"知識就係力量。"},{label:"Zulu",code:"zu",example:"Ulwazi lungamandla."}],HighlightStyleTypes:[{value:"background",label:"Highlight background"},{value:"underline",label:"Underline"},{value:"strikethrough",label:"Strikethrough"},{value:"wavy",label:"Wavy underline"}],HighlightPresetColors:{background:["#F3C9C9","#FEF3CD","#CEFACD","#CDE9FA"],underline:["#FF0000","#60A5FA","#FF9900","#2EFF2E"],strikethrough:["#FF0000","#60A5FA","#FF9900","#2EFF2E"],wavy:["#FF0000","#60A5FA","#FF9900","#2EFF2E"]},PresetThemeList:[{key:"yellow",textColor:"rgba(89, 68, 41,1)",backgroundColor:"rgba(233, 216, 188,1)",title:"羊皮"},{key:"green",textColor:"rgba(54, 80, 62,1)",backgroundColor:"rgba(197, 231, 207,1)",title:"护眼"},{key:"light",textColor:"rgba(0,0,0,1)",backgroundColor:"rgba(255,255,255,1)",title:"白天"},{key:"night",textColor:"rgba(255,255,255,1)",backgroundColor:"rgba(44,47,49,1)",title:"黑夜"},{key:"sepia",textColor:"rgba(93, 64, 55,1)",backgroundColor:"rgba(245, 235, 220,1)",title:"古卷"},{key:"blue",textColor:"rgba(28, 52, 84,1)",backgroundColor:"rgba(230, 240, 250,1)",title:"晨雾"},{key:"purple",textColor:"rgba(68, 42, 84,1)",backgroundColor:"rgba(240, 230, 250,1)",title:"紫萝"},{key:"pink",textColor:"rgba(84, 42, 68,1)",backgroundColor:"rgba(250, 235, 245,1)",title:"樱花"},{key:"brown",textColor:"rgba(74, 54, 42,1)",backgroundColor:"rgba(240, 230, 215,1)",title:"木纹"},{key:"gray",textColor:"rgba(64, 64, 64,1)",backgroundColor:"rgba(240, 240, 240,1)",title:"素雅"},{key:"darkgreen",textColor:"rgba(200, 220, 200,1)",backgroundColor:"rgba(25, 35, 30,1)",title:"深林"},{key:"darkblue",textColor:"rgba(200, 210, 230,1)",backgroundColor:"rgba(20, 30, 45,1)",title:"深海"},{key:"coral",textColor:"rgba(84, 50, 42,1)",backgroundColor:"rgba(255, 235, 230,1)",title:"珊瑚"},{key:"mint",textColor:"rgba(42, 74, 64,1)",backgroundColor:"rgba(230, 250, 245,1)",title:"薄荷"},{key:"lavender",textColor:"rgba(54, 42, 74,1)",backgroundColor:"rgba(245, 240, 255,1)",title:"薰衣"},{key:"cream",textColor:"rgba(74, 64, 42,1)",backgroundColor:"rgba(255, 250, 240,1)",title:"奶油"},{key:"darkbrown",textColor:"rgba(230, 215, 200,1)",backgroundColor:"rgba(35, 25, 20,1)",title:"深棕"},{key:"olive",textColor:"rgba(64, 74, 42,1)",backgroundColor:"rgba(240, 245, 230,1)",title:"橄榄"},{key:"rose",textColor:"rgba(84, 42, 54,1)",backgroundColor:"rgba(255, 240, 245,1)",title:"玫瑰"},{key:"slate",textColor:"rgba(54, 64, 74,1)",backgroundColor:"rgba(235, 240, 245,1)",title:"石板"}],OfficialVoiceList:[{name:"af_alloy",gender:"female",displayName:"Alloy",locale:"en-US",language:"English (US)"},{name:"af_aoede",gender:"female",displayName:"Aoede",locale:"en-US",language:"English (US)"},{name:"af_bella",gender:"female",displayName:"Bella",locale:"en-US",language:"English (US)"},{name:"af_heart",gender:"female",displayName:"Heart",locale:"en-US",language:"English (US)"},{name:"af_jessica",gender:"female",displayName:"Jessica",locale:"en-US",language:"English (US)"},{name:"af_kore",gender:"female",displayName:"Kore",locale:"en-US",language:"English (US)"},{name:"af_nicole",gender:"female",displayName:"Nicole",locale:"en-US",language:"English (US)"},{name:"af_nova",gender:"female",displayName:"Nova",locale:"en-US",language:"English (US)"},{name:"af_river",gender:"female",displayName:"River",locale:"en-US",language:"English (US)"},{name:"af_sarah",gender:"female",displayName:"Sarah",locale:"en-US",language:"English (US)"},{name:"af_sky",gender:"female",displayName:"Sky",locale:"en-US",language:"English (US)"},{name:"am_adam",gender:"male",displayName:"Adam",locale:"en-US",language:"English (US)"},{name:"am_echo",gender:"male",displayName:"Echo",locale:"en-US",language:"English (US)"},{name:"am_eric",gender:"male",displayName:"Eric",locale:"en-US",language:"English (US)"},{name:"am_fenrir",gender:"male",displayName:"Fenrir",locale:"en-US",language:"English (US)"},{name:"am_liam",gender:"male",displayName:"Liam",locale:"en-US",language:"English (US)"},{name:"am_michael",gender:"male",displayName:"Michael",locale:"en-US",language:"English (US)"},{name:"am_onyx",gender:"male",displayName:"Onyx",locale:"en-US",language:"English (US)"},{name:"am_puck",gender:"male",displayName:"Puck",locale:"en-US",language:"English (US)"},{name:"am_santa",gender:"male",displayName:"Santa",locale:"en-US",language:"English (US)"},{name:"bf_alice",gender:"female",displayName:"Alice",locale:"en-GB",language:"English (UK)"},{name:"bf_emma",gender:"female",displayName:"Emma",locale:"en-GB",language:"English (UK)"},{name:"bf_isabella",gender:"female",displayName:"Isabella",locale:"en-GB",language:"English (UK)"},{name:"bf_lily",gender:"female",displayName:"Lily",locale:"en-GB",language:"English (UK)"},{name:"bm_daniel",gender:"male",displayName:"Daniel",locale:"en-GB",language:"English (UK)"},{name:"bm_fable",gender:"male",displayName:"Fable",locale:"en-GB",language:"English (UK)"},{name:"bm_george",gender:"male",displayName:"George",locale:"en-GB",language:"English (UK)"},{name:"bm_lewis",gender:"male",displayName:"Lewis",locale:"en-GB",language:"English (UK)"},{name:"ef_dora",gender:"female",displayName:"Dora",locale:"es-ES",language:"Español"},{name:"em_alex",gender:"male",displayName:"Alex",locale:"es-ES",language:"Español"},{name:"em_santa",gender:"male",displayName:"Santa",locale:"es-ES",language:"Español"},{name:"ff_siwis",gender:"female",displayName:"Siwis",locale:"fr-FR",language:"Français"},{name:"hf_alpha",gender:"female",displayName:"Alpha",locale:"hi-IN",language:"हिन्दी"},{name:"hf_beta",gender:"female",displayName:"Beta",locale:"hi-IN",language:"हिन्दी"},{name:"hm_omega",gender:"male",displayName:"Omega",locale:"hi-IN",language:"हिन्दी"},{name:"hm_psi",gender:"male",displayName:"Psi",locale:"hi-IN",language:"हिन्दी"},{name:"if_sara",gender:"female",displayName:"Sara",locale:"it-IT",language:"Italiano"},{name:"im_nicola",gender:"male",displayName:"Nicola",locale:"it-IT",language:"Italiano"},{name:"jf_alpha",gender:"female",displayName:"Alpha",locale:"ja-JP",language:"日本語"},{name:"jf_gongitsune",gender:"female",displayName:"Gongitsune",locale:"ja-JP",language:"日本語"},{name:"jf_nezumi",gender:"female",displayName:"Nezumi",locale:"ja-JP",language:"日本語"},{name:"jf_tebukuro",gender:"female",displayName:"Tebukuro",locale:"ja-JP",language:"日本語"},{name:"jm_kumo",gender:"male",displayName:"Kumo",locale:"ja-JP",language:"日本語"},{name:"pf_dora",gender:"female",displayName:"Dora",locale:"pt-BR",language:"Português (Brasil)"},{name:"pm_alex",gender:"male",displayName:"Alex",locale:"pt-BR",language:"Português (Brasil)"},{name:"pm_santa",gender:"male",displayName:"Santa",locale:"pt-BR",language:"Português (Brasil)"},{name:"zf_xiaoxiao",gender:"female",displayName:"Xiaoxiao",locale:"zh-CN",language:"中文"},{name:"zm_yunxi",gender:"male",displayName:"Yunxi",locale:"zh-CN",language:"中文"},{name:"zf_xiaoyi",gender:"female",displayName:"Xiaoyi",locale:"zh-CN",language:"中文"},{name:"zm_yunyang",gender:"male",displayName:"Yunyang",locale:"zh-CN",language:"中文"},{name:"zm_yunxia",gender:"male",displayName:"Yunxia",locale:"zh-CN",language:"中文"},{name:"zm_yunjian",gender:"male",displayName:"Yunjian",locale:"zh-CN",language:"中文"},{name:"zf_xiaoni",gender:"female",displayName:"Xiaoni 陕西",locale:"zh-CN",language:"中文"},{name:"zf_xiaobei",gender:"female",displayName:"Xiaobei 辽宁",locale:"zh-CN",language:"中文"}],AzureTTSVoiceList:[{name:"de-DE-AmalaNeural",gender:"female",displayName:"Amala",locale:"de-DE"},{name:"de-DE-BerndNeural",gender:"male",displayName:"Bernd",locale:"de-DE"},{name:"de-DE-ConradNeural",gender:"male",displayName:"Conrad",locale:"de-DE"},{name:"de-DE-KatjaNeural",gender:"female",displayName:"Katja",locale:"de-DE"},{name:"en-GB-LibbyNeural",gender:"female",displayName:"Libby",locale:"en-GB"},{name:"en-GB-RyanNeural",gender:"male",displayName:"Ryan",locale:"en-GB"},{name:"en-GB-SoniaNeural",gender:"female",displayName:"Sonia",locale:"en-GB"},{name:"en-US-AmberNeural",gender:"female",displayName:"Amber",locale:"en-US"},{name:"en-US-AriaNeural",gender:"female",displayName:"Aria",locale:"en-US"},{name:"en-US-ChristopherNeural",gender:"male",displayName:"Christopher",locale:"en-US"},{name:"en-US-DavisNeural",gender:"male",displayName:"Davis",locale:"en-US"},{name:"en-US-EricNeural",gender:"male",displayName:"Eric",locale:"en-US"},{name:"en-US-GuyNeural",gender:"male",displayName:"Guy",locale:"en-US"},{name:"en-US-JaneNeural",gender:"female",displayName:"Jane",locale:"en-US"},{name:"en-US-JennyNeural",gender:"female",displayName:"Jenny",locale:"en-US"},{name:"en-US-MichelleNeural",gender:"female",displayName:"Michelle",locale:"en-US"},{name:"en-US-SaraNeural",gender:"female",displayName:"Sara",locale:"en-US"},{name:"es-ES-AbrilNeural",gender:"female",displayName:"Abril",locale:"es-ES"},{name:"es-ES-AlvaroNeural",gender:"male",displayName:"Álvaro",locale:"es-ES"},{name:"es-ES-ArnauNeural",gender:"male",displayName:"Arnau",locale:"es-ES"},{name:"es-ES-ElviraNeural",gender:"female",displayName:"Elvira",locale:"es-ES"},{name:"fr-FR-DeniseNeural",gender:"female",displayName:"Denise",locale:"fr-FR"},{name:"fr-FR-HenriNeural",gender:"male",displayName:"Henri",locale:"fr-FR"},{name:"it-IT-BenignoNeural",gender:"male",displayName:"Benigno",locale:"it-IT"},{name:"it-IT-DiegoNeural",gender:"male",displayName:"Diego",locale:"it-IT"},{name:"it-IT-ElsaNeural",gender:"female",displayName:"Elsa",locale:"it-IT"},{name:"it-IT-IsabellaNeural",gender:"female",displayName:"Isabella",locale:"it-IT"},{name:"ja-JP-KeitaNeural",gender:"male",displayName:"圭太",locale:"ja-JP"},{name:"ja-JP-NanamiNeural",gender:"female",displayName:"七海",locale:"ja-JP"},{name:"ko-KR-InJoonNeural",gender:"male",displayName:"인준",locale:"ko-KR"},{name:"ko-KR-SoonBokNeural",gender:"female",displayName:"순복",locale:"ko-KR"},{name:"ko-KR-SunHiNeural",gender:"female",displayName:"선히",locale:"ko-KR"},{name:"pt-BR-AntonioNeural",gender:"male",displayName:"Antônio",locale:"pt-BR"},{name:"pt-BR-FranciscaNeural",gender:"female",displayName:"Francisca",locale:"pt-BR"},{name:"pt-PT-DuarteNeural",gender:"male",displayName:"Duarte",locale:"pt-PT"},{name:"pt-PT-RaquelNeural",gender:"female",displayName:"Raquel",locale:"pt-PT"},{name:"ru-RU-DariyaNeural",gender:"female",displayName:"Дария",locale:"ru-RU"},{name:"ru-RU-DmitryNeural",gender:"male",displayName:"Дмитрий",locale:"ru-RU"},{name:"ru-RU-SvetlanaNeural",gender:"female",displayName:"Светлана",locale:"ru-RU"},{name:"yue-CN-XiaoMinNeural",gender:"female",displayName:"晓敏",locale:"yue-CN"},{name:"yue-CN-YunSongNeural",gender:"male",displayName:"云松",locale:"yue-CN"},{name:"zh-CN-XiaoxiaoNeural",gender:"female",displayName:"晓晓",locale:"zh-CN"},{name:"zh-CN-YunxiNeural",gender:"male",displayName:"云希",locale:"zh-CN"},{name:"zh-HK-HiuMaanNeural",gender:"female",displayName:"曉曼",locale:"zh-HK"},{name:"zh-HK-WanLungNeural",gender:"male",displayName:"雲龍",locale:"zh-HK"},{name:"zh-TW-HsiaoChenNeural",gender:"female",displayName:"曉臻",locale:"zh-TW"},{name:"zh-TW-YunJheNeural",gender:"male",displayName:"雲哲",locale:"zh-TW"},{name:"af-ZA-AdriNeural",gender:"female",displayName:"Adri",locale:"af-ZA"},{name:"af-ZA-WillemNeural",gender:"male",displayName:"Willem",locale:"af-ZA"},{name:"sq-AL-AnilaNeural",gender:"female",displayName:"Anila",locale:"sq-AL"},{name:"sq-AL-IlirNeural",gender:"male",displayName:"Ilir",locale:"sq-AL"},{name:"am-ET-AmehaNeural",gender:"male",displayName:"አምሀ",locale:"am-ET"},{name:"am-ET-MekdesNeural",gender:"female",displayName:"መቅደስ",locale:"am-ET"},{name:"ar-DZ-AminaNeural",gender:"female",displayName:"أمينة",locale:"ar-DZ"},{name:"ar-DZ-IsmaelNeural",gender:"male",displayName:"إسماعيل",locale:"ar-DZ"},{name:"ar-BH-AliNeural",gender:"male",displayName:"علي",locale:"ar-BH"},{name:"ar-BH-LailaNeural",gender:"female",displayName:"ليلى",locale:"ar-BH"},{name:"ar-EG-SalmaNeural",gender:"female",displayName:"سلمى",locale:"ar-EG"},{name:"ar-EG-ShakirNeural",gender:"male",displayName:"شاكر",locale:"ar-EG"},{name:"ar-IQ-BasselNeural",gender:"male",displayName:"باسل",locale:"ar-IQ"},{name:"ar-IQ-RanaNeural",gender:"female",displayName:"رنا",locale:"ar-IQ"},{name:"ar-JO-SanaNeural",gender:"female",displayName:"سناء",locale:"ar-JO"},{name:"ar-JO-TaimNeural",gender:"male",displayName:"تيم",locale:"ar-JO"},{name:"ar-KW-FahedNeural",gender:"male",displayName:"فهد",locale:"ar-KW"},{name:"ar-KW-NouraNeural",gender:"female",displayName:"نورا",locale:"ar-KW"},{name:"ar-LB-LaylaNeural",gender:"female",displayName:"ليلى",locale:"ar-LB"},{name:"ar-LB-RamiNeural",gender:"male",displayName:"رامي",locale:"ar-LB"},{name:"ar-LY-ImanNeural",gender:"female",displayName:"إيمان",locale:"ar-LY"},{name:"ar-LY-OmarNeural",gender:"male",displayName:"أحمد",locale:"ar-LY"},{name:"ar-MA-JamalNeural",gender:"male",displayName:"جمال",locale:"ar-MA"},{name:"ar-MA-MounaNeural",gender:"female",displayName:"منى",locale:"ar-MA"},{name:"ar-OM-AbdullahNeural",gender:"male",displayName:"عبدالله",locale:"ar-OM"},{name:"ar-OM-AyshaNeural",gender:"female",displayName:"عائشة",locale:"ar-OM"},{name:"ar-QA-AmalNeural",gender:"female",displayName:"أمل",locale:"ar-QA"},{name:"ar-QA-MoazNeural",gender:"male",displayName:"معاذ",locale:"ar-QA"},{name:"ar-SA-HamedNeural",gender:"male",displayName:"حامد",locale:"ar-SA"},{name:"ar-SA-ZariyahNeural",gender:"female",displayName:"زارية",locale:"ar-SA"},{name:"ar-SY-AmanyNeural",gender:"female",displayName:"أماني",locale:"ar-SY"},{name:"ar-SY-LaithNeural",gender:"male",displayName:"ليث",locale:"ar-SY"},{name:"ar-TN-HediNeural",gender:"male",displayName:"هادي",locale:"ar-TN"},{name:"ar-TN-ReemNeural",gender:"female",displayName:"ريم",locale:"ar-TN"},{name:"ar-AE-FatimaNeural",gender:"female",displayName:"فاطمة",locale:"ar-AE"},{name:"ar-AE-HamdanNeural",gender:"male",displayName:"حمدان",locale:"ar-AE"},{name:"ar-YE-MaryamNeural",gender:"female",displayName:"مريم",locale:"ar-YE"},{name:"ar-YE-SalehNeural",gender:"male",displayName:"صالح",locale:"ar-YE"},{name:"az-AZ-BabekNeural",gender:"male",displayName:"Babək",locale:"az-AZ"},{name:"az-AZ-BanuNeural",gender:"female",displayName:"Banu",locale:"az-AZ"},{name:"bn-BD-NabanitaNeural",gender:"female",displayName:"নবনীতা",locale:"bn-BD"},{name:"bn-BD-PradeepNeural",gender:"male",displayName:"প্রদ্বীপ",locale:"bn-BD"},{name:"bn-IN-BashkarNeural",gender:"male",displayName:"ভাস্কর",locale:"bn-IN"},{name:"bn-IN-TanishaaNeural",gender:"female",displayName:"তানিশা",locale:"bn-IN"},{name:"bs-BA-VesnaNeural",gender:"female",displayName:"Vesna",locale:"bs-BA"},{name:"bs-BA-GoranNeural",gender:"male",displayName:"Goran",locale:"bs-BA"},{name:"bg-BG-BorislavNeural",gender:"male",displayName:"Борислав",locale:"bg-BG"},{name:"bg-BG-KalinaNeural",gender:"female",displayName:"Калина",locale:"bg-BG"},{name:"my-MM-NilarNeural",gender:"female",displayName:"နီလာ",locale:"my-MM"},{name:"my-MM-ThihaNeural",gender:"male",displayName:"သီဟ",locale:"my-MM"},{name:"ca-ES-EnricNeural",gender:"male",displayName:"Enric",locale:"ca-ES"},{name:"ca-ES-JoanaNeural",gender:"female",displayName:"Joana",locale:"ca-ES"},{name:"zh-HK-HiuGaaiNeural",gender:"female",displayName:"曉佳",locale:"zh-HK"},{name:"zh-CN-XiaoyiNeural",gender:"female",displayName:"晓伊",locale:"zh-CN"},{name:"zh-CN-YunjianNeural",gender:"male",displayName:"云健",locale:"zh-CN"},{name:"zh-CN-YunxiaNeural",gender:"male",displayName:"云夏",locale:"zh-CN"},{name:"zh-CN-YunyangNeural",gender:"male",displayName:"云扬",locale:"zh-CN"},{name:"zh-CN-liaoning-XiaobeiNeural",gender:"female",displayName:"晓北 辽宁",locale:"zh-CN"},{name:"zh-CN-shaanxi-XiaoniNeural",gender:"female",displayName:"晓妮 陕西",locale:"zh-CN"},{name:"zh-TW-HsiaoYuNeural",gender:"female",displayName:"曉雨",locale:"zh-TW"},{name:"hr-HR-GabrijelaNeural",gender:"female",displayName:"Gabrijela",locale:"hr-HR"},{name:"hr-HR-SreckoNeural",gender:"male",displayName:"Srećko",locale:"hr-HR"},{name:"cs-CZ-AntoninNeural",gender:"male",displayName:"Antonín",locale:"cs-CZ"},{name:"cs-CZ-VlastaNeural",gender:"female",displayName:"Vlasta",locale:"cs-CZ"},{name:"da-DK-ChristelNeural",gender:"female",displayName:"Christel",locale:"da-DK"},{name:"da-DK-JeppeNeural",gender:"male",displayName:"Jeppe",locale:"da-DK"},{name:"nl-BE-ArnaudNeural",gender:"male",displayName:"Arnaud",locale:"nl-BE"},{name:"nl-BE-DenaNeural",gender:"female",displayName:"Dena",locale:"nl-BE"},{name:"nl-NL-ColetteNeural",gender:"female",displayName:"Colette",locale:"nl-NL"},{name:"nl-NL-FennaNeural",gender:"female",displayName:"Fenna",locale:"nl-NL"},{name:"nl-NL-MaartenNeural",gender:"male",displayName:"Maarten",locale:"nl-NL"},{name:"en-AU-WilliamMultilingualNeural",gender:"male",displayName:"William Multilingual",locale:"en-AU"},{name:"en-AU-NatashaNeural",gender:"female",displayName:"Natasha",locale:"en-AU"},{name:"en-CA-ClaraNeural",gender:"female",displayName:"Clara",locale:"en-CA"},{name:"en-CA-LiamNeural",gender:"male",displayName:"Liam",locale:"en-CA"},{name:"en-HK-YanNeural",gender:"female",displayName:"Yan",locale:"en-HK"},{name:"en-HK-SamNeural",gender:"male",displayName:"Sam",locale:"en-HK"},{name:"en-IN-NeerjaNeural",gender:"female",displayName:"Neerja",locale:"en-IN"},{name:"en-IN-PrabhatNeural",gender:"male",displayName:"Prabhat",locale:"en-IN"},{name:"en-IE-ConnorNeural",gender:"male",displayName:"Connor",locale:"en-IE"},{name:"en-IE-EmilyNeural",gender:"female",displayName:"Emily",locale:"en-IE"},{name:"en-KE-AsiliaNeural",gender:"female",displayName:"Asilia",locale:"en-KE"},{name:"en-KE-ChilembaNeural",gender:"male",displayName:"Chilemba",locale:"en-KE"},{name:"en-NZ-MitchellNeural",gender:"male",displayName:"Mitchell",locale:"en-NZ"},{name:"en-NZ-MollyNeural",gender:"female",displayName:"Molly",locale:"en-NZ"},{name:"en-NG-AbeoNeural",gender:"male",displayName:"Abeo",locale:"en-NG"},{name:"en-NG-EzinneNeural",gender:"female",displayName:"Ezinne",locale:"en-NG"},{name:"en-PH-JamesNeural",gender:"male",displayName:"James",locale:"en-PH"},{name:"en-PH-RosaNeural",gender:"female",displayName:"Rosa",locale:"en-PH"},{name:"en-US-AvaNeural",gender:"female",displayName:"Ava",locale:"en-US"},{name:"en-US-AndrewNeural",gender:"male",displayName:"Andrew",locale:"en-US"},{name:"en-US-EmmaNeural",gender:"female",displayName:"Emma",locale:"en-US"},{name:"en-US-BrianNeural",gender:"male",displayName:"Brian",locale:"en-US"},{name:"en-SG-LunaNeural",gender:"female",displayName:"Luna",locale:"en-SG"},{name:"en-SG-WayneNeural",gender:"male",displayName:"Wayne",locale:"en-SG"},{name:"en-ZA-LeahNeural",gender:"female",displayName:"Leah",locale:"en-ZA"},{name:"en-ZA-LukeNeural",gender:"male",displayName:"Luke",locale:"en-ZA"},{name:"en-TZ-ElimuNeural",gender:"male",displayName:"Elimu",locale:"en-TZ"},{name:"en-TZ-ImaniNeural",gender:"female",displayName:"Imani",locale:"en-TZ"},{name:"en-GB-MaisieNeural",gender:"female",displayName:"Maisie",locale:"en-GB"},{name:"en-GB-ThomasNeural",gender:"male",displayName:"Thomas",locale:"en-GB"},{name:"en-US-AnaNeural",gender:"female",displayName:"Ana",locale:"en-US"},{name:"en-US-AndrewMultilingualNeural",gender:"male",displayName:"Andrew Multilingual",locale:"en-US"},{name:"en-US-AvaMultilingualNeural",gender:"female",displayName:"Ava Multilingual",locale:"en-US"},{name:"en-US-BrianMultilingualNeural",gender:"male",displayName:"Brian Multilingual",locale:"en-US"},{name:"en-US-EmmaMultilingualNeural",gender:"female",displayName:"Emma Multilingual",locale:"en-US"},{name:"en-US-RogerNeural",gender:"male",displayName:"Roger",locale:"en-US"},{name:"en-US-SteffanNeural",gender:"male",displayName:"Steffan",locale:"en-US"},{name:"et-EE-AnuNeural",gender:"female",displayName:"Anu",locale:"et-EE"},{name:"et-EE-KertNeural",gender:"male",displayName:"Kert",locale:"et-EE"},{name:"fil-PH-AngeloNeural",gender:"male",displayName:"Angelo",locale:"fil-PH"},{name:"fil-PH-BlessicaNeural",gender:"female",displayName:"Blessica",locale:"fil-PH"},{name:"fi-FI-HarriNeural",gender:"male",displayName:"Harri",locale:"fi-FI"},{name:"fi-FI-NooraNeural",gender:"female",displayName:"Noora",locale:"fi-FI"},{name:"fr-BE-CharlineNeural",gender:"female",displayName:"Charline",locale:"fr-BE"},{name:"fr-BE-GerardNeural",gender:"male",displayName:"Gerard",locale:"fr-BE"},{name:"fr-CA-ThierryNeural",gender:"male",displayName:"Thierry",locale:"fr-CA"},{name:"fr-CA-AntoineNeural",gender:"male",displayName:"Antoine",locale:"fr-CA"},{name:"fr-CA-JeanNeural",gender:"male",displayName:"Jean",locale:"fr-CA"},{name:"fr-CA-SylvieNeural",gender:"female",displayName:"Sylvie",locale:"fr-CA"},{name:"fr-FR-VivienneMultilingualNeural",gender:"female",displayName:"Vivienne Multilingue",locale:"fr-FR"},{name:"fr-FR-RemyMultilingualNeural",gender:"male",displayName:"Rémy Multilingue",locale:"fr-FR"},{name:"fr-FR-EloiseNeural",gender:"female",displayName:"Eloise",locale:"fr-FR"},{name:"fr-CH-ArianeNeural",gender:"female",displayName:"Ariane",locale:"fr-CH"},{name:"fr-CH-FabriceNeural",gender:"male",displayName:"Fabrice",locale:"fr-CH"},{name:"gl-ES-RoiNeural",gender:"male",displayName:"Roi",locale:"gl-ES"},{name:"gl-ES-SabelaNeural",gender:"female",displayName:"Sabela",locale:"gl-ES"},{name:"ka-GE-EkaNeural",gender:"female",displayName:"ეკა",locale:"ka-GE"},{name:"ka-GE-GiorgiNeural",gender:"male",displayName:"გიორგი",locale:"ka-GE"},{name:"de-AT-IngridNeural",gender:"female",displayName:"Ingrid",locale:"de-AT"},{name:"de-AT-JonasNeural",gender:"male",displayName:"Jonas",locale:"de-AT"},{name:"de-DE-SeraphinaMultilingualNeural",gender:"female",displayName:"Seraphine Mehrsprachig",locale:"de-DE"},{name:"de-DE-FlorianMultilingualNeural",gender:"male",displayName:"Florian Mehrsprachig",locale:"de-DE"},{name:"de-DE-KillianNeural",gender:"male",displayName:"Killian",locale:"de-DE"},{name:"de-CH-JanNeural",gender:"male",displayName:"Jan",locale:"de-CH"},{name:"de-CH-LeniNeural",gender:"female",displayName:"Leni",locale:"de-CH"},{name:"el-GR-AthinaNeural",gender:"female",displayName:"Αθηνά",locale:"el-GR"},{name:"el-GR-NestorasNeural",gender:"male",displayName:"Νέστορας",locale:"el-GR"},{name:"gu-IN-DhwaniNeural",gender:"female",displayName:"ધ્વની",locale:"gu-IN"},{name:"gu-IN-NiranjanNeural",gender:"male",displayName:"નિરંજન",locale:"gu-IN"},{name:"he-IL-AvriNeural",gender:"male",displayName:"אברי",locale:"he-IL"},{name:"he-IL-HilaNeural",gender:"female",displayName:"הילה",locale:"he-IL"},{name:"hi-IN-MadhurNeural",gender:"male",displayName:"मधुर",locale:"hi-IN"},{name:"hi-IN-SwaraNeural",gender:"female",displayName:"स्वरा",locale:"hi-IN"},{name:"hu-HU-NoemiNeural",gender:"female",displayName:"Noémi",locale:"hu-HU"},{name:"hu-HU-TamasNeural",gender:"male",displayName:"Tamás",locale:"hu-HU"},{name:"is-IS-GudrunNeural",gender:"female",displayName:"Guðrún",locale:"is-IS"},{name:"is-IS-GunnarNeural",gender:"male",displayName:"Gunnar",locale:"is-IS"},{name:"id-ID-ArdiNeural",gender:"male",displayName:"Ardi",locale:"id-ID"},{name:"id-ID-GadisNeural",gender:"female",displayName:"Gadis",locale:"id-ID"},{name:"iu-Latn-CA-SiqiniqNeural",gender:"female",displayName:"ᓯᕿᓂᖅ",locale:"iu-Latn-CA"},{name:"iu-Latn-CA-TaqqiqNeural",gender:"male",displayName:"ᑕᖅᑭᖅ",locale:"iu-Latn-CA"},{name:"iu-Cans-CA-SiqiniqNeural",gender:"female",displayName:"ᓯᕿᓂᖅ",locale:"iu-Cans-CA"},{name:"iu-Cans-CA-TaqqiqNeural",gender:"male",displayName:"ᑕᖅᑭᖅ",locale:"iu-Cans-CA"},{name:"ga-IE-ColmNeural",gender:"male",displayName:"Colm",locale:"ga-IE"},{name:"ga-IE-OrlaNeural",gender:"female",displayName:"Orla",locale:"ga-IE"},{name:"it-IT-GiuseppeMultilingualNeural",gender:"male",displayName:"Giuseppe Multilingual",locale:"it-IT"},{name:"jv-ID-DimasNeural",gender:"male",displayName:"Dimas",locale:"jv-ID"},{name:"jv-ID-SitiNeural",gender:"female",displayName:"Siti",locale:"jv-ID"},{name:"kn-IN-GaganNeural",gender:"male",displayName:"ಗಗನ್",locale:"kn-IN"},{name:"kn-IN-SapnaNeural",gender:"female",displayName:"ಸಪ್ನಾ",locale:"kn-IN"},{name:"kk-KZ-AigulNeural",gender:"female",displayName:"Айгүл",locale:"kk-KZ"},{name:"kk-KZ-DauletNeural",gender:"male",displayName:"Дәулет",locale:"kk-KZ"},{name:"km-KH-PisethNeural",gender:"male",displayName:"ពិសិដ្ឋ",locale:"km-KH"},{name:"km-KH-SreymomNeural",gender:"female",displayName:"ស្រីមុំ",locale:"km-KH"},{name:"ko-KR-HyunsuMultilingualNeural",gender:"male",displayName:"Hyunsu Multilingual",locale:"ko-KR"},{name:"lo-LA-ChanthavongNeural",gender:"male",displayName:"ຈັນທະວົງ",locale:"lo-LA"},{name:"lo-LA-KeomanyNeural",gender:"female",displayName:"ແກ້ວມະນີ",locale:"lo-LA"},{name:"lv-LV-EveritaNeural",gender:"female",displayName:"Everita",locale:"lv-LV"},{name:"lv-LV-NilsNeural",gender:"male",displayName:"Nils",locale:"lv-LV"},{name:"lt-LT-LeonasNeural",gender:"male",displayName:"Leonas",locale:"lt-LT"},{name:"lt-LT-OnaNeural",gender:"female",displayName:"Ona",locale:"lt-LT"},{name:"mk-MK-AleksandarNeural",gender:"male",displayName:"Александар",locale:"mk-MK"},{name:"mk-MK-MarijaNeural",gender:"female",displayName:"Марија",locale:"mk-MK"},{name:"ms-MY-OsmanNeural",gender:"male",displayName:"Osman",locale:"ms-MY"},{name:"ms-MY-YasminNeural",gender:"female",displayName:"Yasmin",locale:"ms-MY"},{name:"ml-IN-MidhunNeural",gender:"male",displayName:"മിഥുൻ",locale:"ml-IN"},{name:"ml-IN-SobhanaNeural",gender:"female",displayName:"ശോഭന",locale:"ml-IN"},{name:"mt-MT-GraceNeural",gender:"female",displayName:"Grace",locale:"mt-MT"},{name:"mt-MT-JosephNeural",gender:"male",displayName:"Joseph",locale:"mt-MT"},{name:"mr-IN-AarohiNeural",gender:"female",displayName:"आरोही",locale:"mr-IN"},{name:"mr-IN-ManoharNeural",gender:"male",displayName:"मनोहर",locale:"mr-IN"},{name:"mn-MN-BataaNeural",gender:"male",displayName:"Батаа",locale:"mn-MN"},{name:"mn-MN-YesuiNeural",gender:"female",displayName:"Есүй",locale:"mn-MN"},{name:"ne-NP-HemkalaNeural",gender:"female",displayName:"हेमकला",locale:"ne-NP"},{name:"ne-NP-SagarNeural",gender:"male",displayName:"सागर",locale:"ne-NP"},{name:"nb-NO-FinnNeural",gender:"male",displayName:"Finn",locale:"nb-NO"},{name:"nb-NO-PernilleNeural",gender:"female",displayName:"Pernille",locale:"nb-NO"},{name:"ps-AF-GulNawazNeural",gender:"male",displayName:" ګل نواز",locale:"ps-AF"},{name:"ps-AF-LatifaNeural",gender:"female",displayName:"لطيفه",locale:"ps-AF"},{name:"fa-IR-DilaraNeural",gender:"female",displayName:"دلارا",locale:"fa-IR"},{name:"fa-IR-FaridNeural",gender:"male",displayName:"فرید",locale:"fa-IR"},{name:"pl-PL-MarekNeural",gender:"male",displayName:"Marek",locale:"pl-PL"},{name:"pl-PL-ZofiaNeural",gender:"female",displayName:"Zofia",locale:"pl-PL"},{name:"pt-BR-ThalitaMultilingualNeural",gender:"female",displayName:"Thalita multilíngue",locale:"pt-BR"},{name:"ro-RO-AlinaNeural",gender:"female",displayName:"Alina",locale:"ro-RO"},{name:"ro-RO-EmilNeural",gender:"male",displayName:"Emil",locale:"ro-RO"},{name:"sr-RS-NicholasNeural",gender:"male",displayName:"Никола",locale:"sr-RS"},{name:"sr-RS-SophieNeural",gender:"female",displayName:"Софија",locale:"sr-RS"},{name:"si-LK-SameeraNeural",gender:"male",displayName:"සමීර",locale:"si-LK"},{name:"si-LK-ThiliniNeural",gender:"female",displayName:"තිළිණි",locale:"si-LK"},{name:"sk-SK-LukasNeural",gender:"male",displayName:"Lukáš",locale:"sk-SK"},{name:"sk-SK-ViktoriaNeural",gender:"female",displayName:"Viktória",locale:"sk-SK"},{name:"sl-SI-PetraNeural",gender:"female",displayName:"Petra",locale:"sl-SI"},{name:"sl-SI-RokNeural",gender:"male",displayName:"Rok",locale:"sl-SI"},{name:"so-SO-MuuseNeural",gender:"male",displayName:"Muuse",locale:"so-SO"},{name:"so-SO-UbaxNeural",gender:"female",displayName:"Ubax",locale:"so-SO"},{name:"es-AR-ElenaNeural",gender:"female",displayName:"Elena",locale:"es-AR"},{name:"es-AR-TomasNeural",gender:"male",displayName:"Tomas",locale:"es-AR"},{name:"es-BO-MarceloNeural",gender:"male",displayName:"Marcelo",locale:"es-BO"},{name:"es-BO-SofiaNeural",gender:"female",displayName:"Sofia",locale:"es-BO"},{name:"es-CL-CatalinaNeural",gender:"female",displayName:"Catalina",locale:"es-CL"},{name:"es-CL-LorenzoNeural",gender:"male",displayName:"Lorenzo",locale:"es-CL"},{name:"es-CO-GonzaloNeural",gender:"male",displayName:"Gonzalo",locale:"es-CO"},{name:"es-CO-SalomeNeural",gender:"female",displayName:"Salome",locale:"es-CO"},{name:"es-ES-XimenaNeural",gender:"female",displayName:"Ximena",locale:"es-ES"},{name:"es-CR-JuanNeural",gender:"male",displayName:"Juan",locale:"es-CR"},{name:"es-CR-MariaNeural",gender:"female",displayName:"María",locale:"es-CR"},{name:"es-CU-BelkysNeural",gender:"female",displayName:"Belkys",locale:"es-CU"},{name:"es-CU-ManuelNeural",gender:"male",displayName:"Manuel",locale:"es-CU"},{name:"es-DO-EmilioNeural",gender:"male",displayName:"Emilio",locale:"es-DO"},{name:"es-DO-RamonaNeural",gender:"female",displayName:"Ramona",locale:"es-DO"},{name:"es-EC-AndreaNeural",gender:"female",displayName:"Andrea",locale:"es-EC"},{name:"es-EC-LuisNeural",gender:"male",displayName:"Luis",locale:"es-EC"},{name:"es-SV-LorenaNeural",gender:"female",displayName:"Lorena",locale:"es-SV"},{name:"es-SV-RodrigoNeural",gender:"male",displayName:"Rodrigo",locale:"es-SV"},{name:"es-GQ-JavierNeural",gender:"male",displayName:"Javier",locale:"es-GQ"},{name:"es-GQ-TeresaNeural",gender:"female",displayName:"Teresa",locale:"es-GQ"},{name:"es-GT-AndresNeural",gender:"male",displayName:"Andrés",locale:"es-GT"},{name:"es-GT-MartaNeural",gender:"female",displayName:"Marta",locale:"es-GT"},{name:"es-HN-CarlosNeural",gender:"male",displayName:"Carlos",locale:"es-HN"},{name:"es-HN-KarlaNeural",gender:"female",displayName:"Karla",locale:"es-HN"},{name:"es-MX-DaliaNeural",gender:"female",displayName:"Dalia",locale:"es-MX"},{name:"es-MX-JorgeNeural",gender:"male",displayName:"Jorge",locale:"es-MX"},{name:"es-NI-FedericoNeural",gender:"male",displayName:"Federico",locale:"es-NI"},{name:"es-NI-YolandaNeural",gender:"female",displayName:"Yolanda",locale:"es-NI"},{name:"es-PA-MargaritaNeural",gender:"female",displayName:"Margarita",locale:"es-PA"},{name:"es-PA-RobertoNeural",gender:"male",displayName:"Roberto",locale:"es-PA"},{name:"es-PY-MarioNeural",gender:"male",displayName:"Mario",locale:"es-PY"},{name:"es-PY-TaniaNeural",gender:"female",displayName:"Tania",locale:"es-PY"},{name:"es-PE-AlexNeural",gender:"male",displayName:"Alex",locale:"es-PE"},{name:"es-PE-CamilaNeural",gender:"female",displayName:"Camila",locale:"es-PE"},{name:"es-PR-KarinaNeural",gender:"female",displayName:"Karina",locale:"es-PR"},{name:"es-PR-VictorNeural",gender:"male",displayName:"Víctor",locale:"es-PR"},{name:"es-US-AlonsoNeural",gender:"male",displayName:"Alonso",locale:"es-US"},{name:"es-US-PalomaNeural",gender:"female",displayName:"Paloma",locale:"es-US"},{name:"es-UY-MateoNeural",gender:"male",displayName:"Mateo",locale:"es-UY"},{name:"es-UY-ValentinaNeural",gender:"female",displayName:"Valentina",locale:"es-UY"},{name:"es-VE-PaolaNeural",gender:"female",displayName:"Paola",locale:"es-VE"},{name:"es-VE-SebastianNeural",gender:"male",displayName:"Sebastián",locale:"es-VE"},{name:"su-ID-JajangNeural",gender:"male",displayName:"Jajang",locale:"su-ID"},{name:"su-ID-TutiNeural",gender:"female",displayName:"Tuti",locale:"su-ID"},{name:"sw-KE-RafikiNeural",gender:"male",displayName:"Rafiki",locale:"sw-KE"},{name:"sw-KE-ZuriNeural",gender:"female",displayName:"Zuri",locale:"sw-KE"},{name:"sw-TZ-DaudiNeural",gender:"male",displayName:"Daudi",locale:"sw-TZ"},{name:"sw-TZ-RehemaNeural",gender:"female",displayName:"Rehema",locale:"sw-TZ"},{name:"sv-SE-MattiasNeural",gender:"male",displayName:"Mattias",locale:"sv-SE"},{name:"sv-SE-SofieNeural",gender:"female",displayName:"Sofie",locale:"sv-SE"},{name:"ta-IN-PallaviNeural",gender:"female",displayName:"பல்லவி",locale:"ta-IN"},{name:"ta-IN-ValluvarNeural",gender:"male",displayName:"வள்ளுவர்",locale:"ta-IN"},{name:"ta-MY-KaniNeural",gender:"female",displayName:"கனி",locale:"ta-MY"},{name:"ta-MY-SuryaNeural",gender:"male",displayName:"சூர்யா",locale:"ta-MY"},{name:"ta-SG-AnbuNeural",gender:"male",displayName:"அன்பு",locale:"ta-SG"},{name:"ta-SG-VenbaNeural",gender:"female",displayName:"வெண்பா",locale:"ta-SG"},{name:"ta-LK-KumarNeural",gender:"male",displayName:"குமார்",locale:"ta-LK"},{name:"ta-LK-SaranyaNeural",gender:"female",displayName:"சரண்யா",locale:"ta-LK"},{name:"te-IN-MohanNeural",gender:"male",displayName:"మోహన్",locale:"te-IN"},{name:"te-IN-ShrutiNeural",gender:"female",displayName:"శ్రుతి",locale:"te-IN"},{name:"th-TH-NiwatNeural",gender:"male",displayName:"นิวัฒน์",locale:"th-TH"},{name:"th-TH-PremwadeeNeural",gender:"female",displayName:"เปรมวดี",locale:"th-TH"},{name:"tr-TR-EmelNeural",gender:"female",displayName:"Emel",locale:"tr-TR"},{name:"tr-TR-AhmetNeural",gender:"male",displayName:"Ahmet",locale:"tr-TR"},{name:"uk-UA-OstapNeural",gender:"male",displayName:"Остап",locale:"uk-UA"},{name:"uk-UA-PolinaNeural",gender:"female",displayName:"Поліна",locale:"uk-UA"},{name:"ur-IN-GulNeural",gender:"female",displayName:"گل",locale:"ur-IN"},{name:"ur-IN-SalmanNeural",gender:"male",displayName:"سلمان",locale:"ur-IN"},{name:"ur-PK-AsadNeural",gender:"male",displayName:"اسد",locale:"ur-PK"},{name:"ur-PK-UzmaNeural",gender:"female",displayName:"عظمیٰ",locale:"ur-PK"},{name:"uz-UZ-MadinaNeural",gender:"female",displayName:"Madina",locale:"uz-UZ"},{name:"uz-UZ-SardorNeural",gender:"male",displayName:"Sardor",locale:"uz-UZ"},{name:"vi-VN-HoaiMyNeural",gender:"female",displayName:"Hoài My",locale:"vi-VN"},{name:"vi-VN-NamMinhNeural",gender:"male",displayName:"Nam Minh",locale:"vi-VN"},{name:"cy-GB-AledNeural",gender:"male",displayName:"Aled",locale:"cy-GB"},{name:"cy-GB-NiaNeural",gender:"female",displayName:"Nia",locale:"cy-GB"},{name:"zu-ZA-ThandoNeural",gender:"female",displayName:"Thando",locale:"zu-ZA"},{name:"zu-ZA-ThembaNeural",gender:"male",displayName:"Themba",locale:"zu-ZA"},{name:"as-IN-YashicaNeural",gender:"female",displayName:"যাশিকা",locale:"as-IN"},{name:"as-IN-PriyomNeural",gender:"male",displayName:"প্ৰিয়ম",locale:"as-IN"},{name:"ca-ES-AlbaNeural",gender:"female",displayName:"Alba",locale:"ca-ES"},{name:"de-DE-ChristophNeural",gender:"male",displayName:"Christoph",locale:"de-DE"},{name:"de-DE-ElkeNeural",gender:"female",displayName:"Elke",locale:"de-DE"},{name:"de-DE-GiselaNeural",gender:"female",displayName:"Gisela",locale:"de-DE"},{name:"de-DE-KasperNeural",gender:"male",displayName:"Kasper",locale:"de-DE"},{name:"de-DE-KlarissaNeural",gender:"female",displayName:"Klarissa",locale:"de-DE"},{name:"de-DE-KlausNeural",gender:"male",displayName:"Klaus",locale:"de-DE"},{name:"de-DE-LouisaNeural",gender:"female",displayName:"Louisa",locale:"de-DE"},{name:"de-DE-MajaNeural",gender:"female",displayName:"Maja",locale:"de-DE"},{name:"de-DE-RalfNeural",gender:"male",displayName:"Ralf",locale:"de-DE"},{name:"de-DE-TanjaNeural",gender:"female",displayName:"Tanja",locale:"de-DE"},{name:"en-AU-WilliamNeural",gender:"male",displayName:"William",locale:"en-AU"},{name:"en-AU-AnnetteNeural",gender:"female",displayName:"Annette",locale:"en-AU"},{name:"en-AU-CarlyNeural",gender:"female",displayName:"Carly",locale:"en-AU"},{name:"en-AU-DarrenNeural",gender:"male",displayName:"Darren",locale:"en-AU"},{name:"en-AU-DuncanNeural",gender:"male",displayName:"Duncan",locale:"en-AU"},{name:"en-AU-ElsieNeural",gender:"female",displayName:"Elsie",locale:"en-AU"},{name:"en-AU-FreyaNeural",gender:"female",displayName:"Freya",locale:"en-AU"},{name:"en-AU-JoanneNeural",gender:"female",displayName:"Joanne",locale:"en-AU"},{name:"en-AU-KenNeural",gender:"male",displayName:"Ken",locale:"en-AU"},{name:"en-AU-KimNeural",gender:"female",displayName:"Kim",locale:"en-AU"},{name:"en-AU-NeilNeural",gender:"male",displayName:"Neil",locale:"en-AU"},{name:"en-AU-TimNeural",gender:"male",displayName:"Tim",locale:"en-AU"},{name:"en-AU-TinaNeural",gender:"female",displayName:"Tina",locale:"en-AU"},{name:"en-GB-AdaMultilingualNeural",gender:"female",displayName:"Ada Multilingual",locale:"en-GB"},{name:"en-GB-OllieMultilingualNeural",gender:"male",displayName:"Ollie Multilingual",locale:"en-GB"},{name:"en-GB-AbbiNeural",gender:"female",displayName:"Abbi",locale:"en-GB"},{name:"en-GB-AlfieNeural",gender:"male",displayName:"Alfie",locale:"en-GB"},{name:"en-GB-BellaNeural",gender:"female",displayName:"Bella",locale:"en-GB"},{name:"en-GB-ElliotNeural",gender:"male",displayName:"Elliot",locale:"en-GB"},{name:"en-GB-EthanNeural",gender:"male",displayName:"Ethan",locale:"en-GB"},{name:"en-GB-HollieNeural",gender:"female",displayName:"Hollie",locale:"en-GB"},{name:"en-GB-NoahNeural",gender:"male",displayName:"Noah",locale:"en-GB"},{name:"en-GB-OliverNeural",gender:"male",displayName:"Oliver",locale:"en-GB"},{name:"en-GB-OliviaNeural",gender:"female",displayName:"Olivia",locale:"en-GB"},{name:"en-GB-MiaNeural",gender:"female",displayName:"Mia",locale:"en-GB"},{name:"en-IN-AartiIndicNeural",gender:"female",displayName:"Aarti Indic",locale:"en-IN"},{name:"en-IN-ArjunIndicNeural",gender:"male",displayName:"Arjun Indic",locale:"en-IN"},{name:"en-IN-NeerjaIndicNeural",gender:"female",displayName:"Neerja Indic",locale:"en-IN"},{name:"en-IN-PrabhatIndicNeural",gender:"male",displayName:"Prabhat Indic",locale:"en-IN"},{name:"en-IN-AaravNeural",gender:"male",displayName:"Aarav",locale:"en-IN"},{name:"en-IN-AashiNeural",gender:"female",displayName:"Aashi",locale:"en-IN"},{name:"en-IN-AartiNeural",gender:"female",displayName:"Aarti",locale:"en-IN"},{name:"en-IN-ArjunNeural",gender:"male",displayName:"Arjun",locale:"en-IN"},{name:"en-IN-AnanyaNeural",gender:"female",displayName:"Ananya",locale:"en-IN"},{name:"en-IN-KavyaNeural",gender:"female",displayName:"Kavya",locale:"en-IN"},{name:"en-IN-KunalNeural",gender:"male",displayName:"Kunal",locale:"en-IN"},{name:"en-IN-RehaanNeural",gender:"male",displayName:"Rehaan",locale:"en-IN"},{name:"en-US-AmandaMultilingualNeural",gender:"female",displayName:"Amanda Multilingual",locale:"en-US"},{name:"en-US-AdamMultilingualNeural",gender:"male",displayName:"Adam Multilingual",locale:"en-US"},{name:"en-US-PhoebeMultilingualNeural",gender:"female",displayName:"Phoebe Multilingual",locale:"en-US"},{name:"en-US-AlloyTurboMultilingualNeural",gender:"male",displayName:"Alloy Turbo Multilingual",locale:"en-US"},{name:"en-US-EchoTurboMultilingualNeural",gender:"male",displayName:"Echo Turbo Multilingual",locale:"en-US"},{name:"en-US-FableTurboMultilingualNeural",gender:"female",displayName:"Fable Turbo Multilingual",locale:"en-US"},{name:"en-US-OnyxTurboMultilingualNeural",gender:"male",displayName:"Onyx Turbo Multilingual",locale:"en-US"},{name:"en-US-NovaTurboMultilingualNeural",gender:"female",displayName:"Nova Turbo Multilingual",locale:"en-US"},{name:"en-US-ShimmerTurboMultilingualNeural",gender:"female",displayName:"Shimmer Turbo Multilingual",locale:"en-US"},{name:"en-US-JasonNeural",gender:"male",displayName:"Jason",locale:"en-US"},{name:"en-US-KaiNeural",gender:"male",displayName:"Kai",locale:"en-US"},{name:"en-US-LunaNeural",gender:"female",displayName:"Luna",locale:"en-US"},{name:"en-US-TonyNeural",gender:"male",displayName:"Tony",locale:"en-US"},{name:"en-US-NancyNeural",gender:"female",displayName:"Nancy",locale:"en-US"},{name:"en-US-CoraMultilingualNeural",gender:"female",displayName:"Cora Multilingual",locale:"en-US"},{name:"en-US-ChristopherMultilingualNeural",gender:"male",displayName:"Christopher Multilingual",locale:"en-US"},{name:"en-US-BrandonMultilingualNeural",gender:"male",displayName:"Brandon Multilingual",locale:"en-US"},{name:"en-US-AshleyNeural",gender:"female",displayName:"Ashley",locale:"en-US"},{name:"en-US-BrandonNeural",gender:"male",displayName:"Brandon",locale:"en-US"},{name:"en-US-CoraNeural",gender:"female",displayName:"Cora",locale:"en-US"},{name:"en-US-DavisMultilingualNeural",gender:"male",displayName:"Davis Multilingual",locale:"en-US"},{name:"en-US-DerekMultilingualNeural",gender:"male",displayName:"Derek Multilingual",locale:"en-US"},{name:"en-US-DustinMultilingualNeural",gender:"male",displayName:"Dustin Multilingual",locale:"en-US"},{name:"en-US-ElizabethNeural",gender:"female",displayName:"Elizabeth",locale:"en-US"},{name:"en-US-JacobNeural",gender:"male",displayName:"Jacob",locale:"en-US"},{name:"en-US-JennyMultilingualNeural",gender:"female",displayName:"Jenny Multilingual",locale:"en-US"},{name:"en-US-LewisMultilingualNeural",gender:"male",displayName:"Lewis Multilingual",locale:"en-US"},{name:"en-US-LolaMultilingualNeural",gender:"female",displayName:"Lola Multilingual",locale:"en-US"},{name:"en-US-MonicaNeural",gender:"female",displayName:"Monica",locale:"en-US"},{name:"en-US-NancyMultilingualNeural",gender:"female",displayName:"Nancy Multilingual",locale:"en-US"},{name:"en-US-RyanMultilingualNeural",gender:"male",displayName:"Ryan Multilingual",locale:"en-US"},{name:"en-US-SamuelMultilingualNeural",gender:"male",displayName:"Samuel Multilingual",locale:"en-US"},{name:"en-US-SerenaMultilingualNeural",gender:"female",displayName:"Serena Multilingual",locale:"en-US"},{name:"en-US-SteffanMultilingualNeural",gender:"male",displayName:"Steffan Multilingual",locale:"en-US"},{name:"en-US-AIGenerate1Neural",gender:"male",displayName:"AIGenerate1",locale:"en-US"},{name:"en-US-AIGenerate2Neural",gender:"female",displayName:"AIGenerate2",locale:"en-US"},{name:"en-US-AshTurboMultilingualNeural",gender:"male",displayName:"Ash Turbo Multilingual",locale:"en-US"},{name:"en-US-BlueNeural",gender:"female",displayName:"Blue",locale:"en-US"},{name:"en-US-EvelynMultilingualNeural",gender:"female",displayName:"Evelyn Multilingual",locale:"en-US"},{name:"es-ES-ArabellaMultilingualNeural",gender:"female",displayName:"Arabella Multilingual",locale:"es-ES"},{name:"es-ES-IsidoraMultilingualNeural",gender:"female",displayName:"Isidora Multilingual",locale:"es-ES"},{name:"es-ES-TristanMultilingualNeural",gender:"male",displayName:"Tristan Multilingual",locale:"es-ES"},{name:"es-ES-XimenaMultilingualNeural",gender:"female",displayName:"Ximena Multilingual",locale:"es-ES"},{name:"es-ES-DarioNeural",gender:"male",displayName:"Dario",locale:"es-ES"},{name:"es-ES-EliasNeural",gender:"male",displayName:"Elias",locale:"es-ES"},{name:"es-ES-EstrellaNeural",gender:"female",displayName:"Estrella",locale:"es-ES"},{name:"es-ES-IreneNeural",gender:"female",displayName:"Irene",locale:"es-ES"},{name:"es-ES-LaiaNeural",gender:"female",displayName:"Laia",locale:"es-ES"},{name:"es-ES-LiaNeural",gender:"female",displayName:"Lia",locale:"es-ES"},{name:"es-ES-NilNeural",gender:"male",displayName:"Nil",locale:"es-ES"},{name:"es-ES-SaulNeural",gender:"male",displayName:"Saul",locale:"es-ES"},{name:"es-ES-TeoNeural",gender:"male",displayName:"Teo",locale:"es-ES"},{name:"es-ES-TrianaNeural",gender:"female",displayName:"Triana",locale:"es-ES"},{name:"es-ES-VeraNeural",gender:"female",displayName:"Vera",locale:"es-ES"},{name:"es-MX-DaliaMultilingualNeural",gender:"female",displayName:"Dalia Multilingual",locale:"es-MX"},{name:"es-MX-JorgeMultilingualNeural",gender:"male",displayName:"Jorge Multilingual",locale:"es-MX"},{name:"es-MX-BeatrizNeural",gender:"female",displayName:"Beatriz",locale:"es-MX"},{name:"es-MX-CandelaNeural",gender:"female",displayName:"Candela",locale:"es-MX"},{name:"es-MX-CarlotaNeural",gender:"female",displayName:"Carlota",locale:"es-MX"},{name:"es-MX-CecilioNeural",gender:"male",displayName:"Cecilio",locale:"es-MX"},{name:"es-MX-GerardoNeural",gender:"male",displayName:"Gerardo",locale:"es-MX"},{name:"es-MX-LarissaNeural",gender:"female",displayName:"Larissa",locale:"es-MX"},{name:"es-MX-LibertoNeural",gender:"male",displayName:"Liberto",locale:"es-MX"},{name:"es-MX-LucianoNeural",gender:"male",displayName:"Luciano",locale:"es-MX"},{name:"es-MX-MarinaNeural",gender:"female",displayName:"Marina",locale:"es-MX"},{name:"es-MX-NuriaNeural",gender:"female",displayName:"Nuria",locale:"es-MX"},{name:"es-MX-PelayoNeural",gender:"male",displayName:"Pelayo",locale:"es-MX"},{name:"es-MX-RenataNeural",gender:"female",displayName:"Renata",locale:"es-MX"},{name:"es-MX-YagoNeural",gender:"male",displayName:"Yago",locale:"es-MX"},{name:"eu-ES-AinhoaNeural",gender:"female",displayName:"Ainhoa",locale:"eu-ES"},{name:"eu-ES-AnderNeural",gender:"male",displayName:"Ander",locale:"eu-ES"},{name:"fi-FI-SelmaNeural",gender:"female",displayName:"Selma",locale:"fi-FI"},{name:"fr-FR-LucienMultilingualNeural",gender:"male",displayName:"Lucien Multilingual",locale:"fr-FR"},{name:"fr-FR-AlainNeural",gender:"male",displayName:"Alain",locale:"fr-FR"},{name:"fr-FR-BrigitteNeural",gender:"female",displayName:"Brigitte",locale:"fr-FR"},{name:"fr-FR-CelesteNeural",gender:"female",displayName:"Celeste",locale:"fr-FR"},{name:"fr-FR-ClaudeNeural",gender:"male",displayName:"Claude",locale:"fr-FR"},{name:"fr-FR-CoralieNeural",gender:"female",displayName:"Coralie",locale:"fr-FR"},{name:"fr-FR-JacquelineNeural",gender:"female",displayName:"Jacqueline",locale:"fr-FR"},{name:"fr-FR-JeromeNeural",gender:"male",displayName:"Jerome",locale:"fr-FR"},{name:"fr-FR-JosephineNeural",gender:"female",displayName:"Josephine",locale:"fr-FR"},{name:"fr-FR-MauriceNeural",gender:"male",displayName:"Maurice",locale:"fr-FR"},{name:"fr-FR-YvesNeural",gender:"male",displayName:"Yves",locale:"fr-FR"},{name:"fr-FR-YvetteNeural",gender:"female",displayName:"Yvette",locale:"fr-FR"},{name:"hi-IN-AaravNeural",gender:"male",displayName:"आरव ",locale:"hi-IN"},{name:"hi-IN-AnanyaNeural",gender:"female",displayName:"अनन्या",locale:"hi-IN"},{name:"hi-IN-AartiNeural",gender:"female",displayName:"आरती",locale:"hi-IN"},{name:"hi-IN-ArjunNeural",gender:"male",displayName:"अर्जुन",locale:"hi-IN"},{name:"hi-IN-KavyaNeural",gender:"female",displayName:"काव्या",locale:"hi-IN"},{name:"hi-IN-KunalNeural",gender:"male",displayName:"कुनाल ",locale:"hi-IN"},{name:"hi-IN-RehaanNeural",gender:"male",displayName:"रेहान",locale:"hi-IN"},{name:"hy-AM-AnahitNeural",gender:"female",displayName:"Անահիտ",locale:"hy-AM"},{name:"hy-AM-HaykNeural",gender:"male",displayName:"Հայկ",locale:"hy-AM"},{name:"it-IT-AlessioMultilingualNeural",gender:"male",displayName:"Alessio Multilingual",locale:"it-IT"},{name:"it-IT-IsabellaMultilingualNeural",gender:"female",displayName:"Isabella Multilingual",locale:"it-IT"},{name:"it-IT-MarcelloMultilingualNeural",gender:"male",displayName:"Marcello Multilingual",locale:"it-IT"},{name:"it-IT-CalimeroNeural",gender:"male",displayName:"Calimero",locale:"it-IT"},{name:"it-IT-CataldoNeural",gender:"male",displayName:"Cataldo",locale:"it-IT"},{name:"it-IT-FabiolaNeural",gender:"female",displayName:"Fabiola",locale:"it-IT"},{name:"it-IT-FiammaNeural",gender:"female",displayName:"Fiamma",locale:"it-IT"},{name:"it-IT-GianniNeural",gender:"male",displayName:"Gianni",locale:"it-IT"},{name:"it-IT-GiuseppeNeural",gender:"male",displayName:"Giuseppe",locale:"it-IT"},{name:"it-IT-ImeldaNeural",gender:"female",displayName:"Imelda",locale:"it-IT"},{name:"it-IT-IrmaNeural",gender:"female",displayName:"Irma",locale:"it-IT"},{name:"it-IT-LisandroNeural",gender:"male",displayName:"Lisandro",locale:"it-IT"},{name:"it-IT-PalmiraNeural",gender:"female",displayName:"Palmira",locale:"it-IT"},{name:"it-IT-PierinaNeural",gender:"female",displayName:"Pierina",locale:"it-IT"},{name:"it-IT-RinaldoNeural",gender:"male",displayName:"Rinaldo",locale:"it-IT"},{name:"ja-JP-AoiNeural",gender:"female",displayName:"碧衣",locale:"ja-JP"},{name:"ja-JP-DaichiNeural",gender:"male",displayName:"大智",locale:"ja-JP"},{name:"ja-JP-MayuNeural",gender:"female",displayName:"真夕",locale:"ja-JP"},{name:"ja-JP-NaokiNeural",gender:"male",displayName:"直紀",locale:"ja-JP"},{name:"ja-JP-ShioriNeural",gender:"female",displayName:"志織",locale:"ja-JP"},{name:"ja-JP-MasaruMultilingualNeural",gender:"male",displayName:"勝 多言語",locale:"ja-JP"},{name:"ko-KR-BongJinNeural",gender:"male",displayName:"봉진",locale:"ko-KR"},{name:"ko-KR-GookMinNeural",gender:"male",displayName:"국민",locale:"ko-KR"},{name:"ko-KR-HyunsuNeural",gender:"male",displayName:"현수",locale:"ko-KR"},{name:"ko-KR-JiMinNeural",gender:"female",displayName:"지민",locale:"ko-KR"},{name:"ko-KR-SeoHyeonNeural",gender:"female",displayName:"서현",locale:"ko-KR"},{name:"ko-KR-YuJinNeural",gender:"female",displayName:"유진",locale:"ko-KR"},{name:"nb-NO-IselinNeural",gender:"female",displayName:"Iselin",locale:"nb-NO"},{name:"or-IN-SubhasiniNeural",gender:"female",displayName:"ସୁଭାସିନୀ",locale:"or-IN"},{name:"or-IN-SukantNeural",gender:"male",displayName:"ସୁକାନ୍ତ",locale:"or-IN"},{name:"pa-IN-OjasNeural",gender:"male",displayName:"ਓਜਸ",locale:"pa-IN"},{name:"pa-IN-VaaniNeural",gender:"female",displayName:"ਵਾਨੀ",locale:"pa-IN"},{name:"pl-PL-AgnieszkaNeural",gender:"female",displayName:"Agnieszka",locale:"pl-PL"},{name:"pt-BR-MacerioMultilingualNeural",gender:"male",displayName:"Macerio Multilingual",locale:"pt-BR"},{name:"pt-BR-BrendaNeural",gender:"female",displayName:"Brenda",locale:"pt-BR"},{name:"pt-BR-DonatoNeural",gender:"male",displayName:"Donato",locale:"pt-BR"},{name:"pt-BR-ElzaNeural",gender:"female",displayName:"Elza",locale:"pt-BR"},{name:"pt-BR-FabioNeural",gender:"male",displayName:"Fabio",locale:"pt-BR"},{name:"pt-BR-GiovannaNeural",gender:"female",displayName:"Giovanna",locale:"pt-BR"},{name:"pt-BR-HumbertoNeural",gender:"male",displayName:"Humberto",locale:"pt-BR"},{name:"pt-BR-JulioNeural",gender:"male",displayName:"Julio",locale:"pt-BR"},{name:"pt-BR-LeilaNeural",gender:"female",displayName:"Leila",locale:"pt-BR"},{name:"pt-BR-LeticiaNeural",gender:"female",displayName:"Leticia",locale:"pt-BR"},{name:"pt-BR-ManuelaNeural",gender:"female",displayName:"Manuela",locale:"pt-BR"},{name:"pt-BR-NicolauNeural",gender:"male",displayName:"Nicolau",locale:"pt-BR"},{name:"pt-BR-ThalitaNeural",gender:"female",displayName:"Thalita",locale:"pt-BR"},{name:"pt-BR-ValerioNeural",gender:"male",displayName:"Valerio",locale:"pt-BR"},{name:"pt-BR-YaraNeural",gender:"female",displayName:"Yara",locale:"pt-BR"},{name:"pt-PT-FernandaNeural",gender:"female",displayName:"Fernanda",locale:"pt-PT"},{name:"sr-Latn-RS-NicholasNeural",gender:"male",displayName:"Nicholas",locale:"sr-Latn-RS"},{name:"sr-Latn-RS-SophieNeural",gender:"female",displayName:"Sophie",locale:"sr-Latn-RS"},{name:"sv-SE-HilleviNeural",gender:"female",displayName:"Hillevi",locale:"sv-SE"},{name:"th-TH-AcharaNeural",gender:"female",displayName:"อัจฉรา",locale:"th-TH"},{name:"wuu-CN-XiaotongNeural",gender:"female",displayName:"晓彤",locale:"wuu-CN"},{name:"wuu-CN-YunzheNeural",gender:"male",displayName:"云哲",locale:"wuu-CN"},{name:"zh-CN-XiaochenNeural",gender:"female",displayName:"晓辰",locale:"zh-CN"},{name:"zh-CN-XiaochenMultilingualNeural",gender:"female",displayName:"晓辰 多语言",locale:"zh-CN"},{name:"zh-CN-XiaohanNeural",gender:"female",displayName:"晓涵",locale:"zh-CN"},{name:"zh-CN-XiaomengNeural",gender:"female",displayName:"晓梦",locale:"zh-CN"},{name:"zh-CN-XiaomoNeural",gender:"female",displayName:"晓墨",locale:"zh-CN"},{name:"zh-CN-XiaoqiuNeural",gender:"female",displayName:"晓秋",locale:"zh-CN"},{name:"zh-CN-XiaorouNeural",gender:"female",displayName:"晓柔",locale:"zh-CN"},{name:"zh-CN-XiaoruiNeural",gender:"female",displayName:"晓睿",locale:"zh-CN"},{name:"zh-CN-XiaoshuangNeural",gender:"female",displayName:"晓双",locale:"zh-CN"},{name:"zh-CN-XiaoxiaoDialectsNeural",gender:"female",displayName:"晓晓 ",locale:"zh-CN"},{name:"zh-CN-XiaoxiaoMultilingualNeural",gender:"female",displayName:"晓晓 多语言",locale:"zh-CN"},{name:"zh-CN-XiaoyanNeural",gender:"female",displayName:"晓颜",locale:"zh-CN"},{name:"zh-CN-XiaoyouNeural",gender:"female",displayName:"晓悠",locale:"zh-CN"},{name:"zh-CN-XiaoyuMultilingualNeural",gender:"female",displayName:"晓宇 多语言",locale:"zh-CN"},{name:"zh-CN-XiaozhenNeural",gender:"female",displayName:"晓甄",locale:"zh-CN"},{name:"zh-CN-YunfengNeural",gender:"male",displayName:"云枫",locale:"zh-CN"},{name:"zh-CN-YunhaoNeural",gender:"male",displayName:"云皓",locale:"zh-CN"},{name:"zh-CN-YunjieNeural",gender:"male",displayName:"云杰",locale:"zh-CN"},{name:"zh-CN-YunxiaoMultilingualNeural",gender:"male",displayName:"云霄 多语言",locale:"zh-CN"},{name:"zh-CN-YunyeNeural",gender:"male",displayName:"云野",locale:"zh-CN"},{name:"zh-CN-YunyiMultilingualNeural",gender:"male",displayName:"云逸 多语言",locale:"zh-CN"},{name:"zh-CN-YunzeNeural",gender:"male",displayName:"云泽",locale:"zh-CN"},{name:"zh-CN-YunfanMultilingualNeural",gender:"male",displayName:"云帆 多语言",locale:"zh-CN"},{name:"zh-CN-guangxi-YunqiNeural",gender:"male",displayName:"云奇 广西",locale:"zh-CN"},{name:"zh-CN-henan-YundengNeural",gender:"male",displayName:"云登 河南",locale:"zh-CN"},{name:"zh-CN-liaoning-YunbiaoNeural",gender:"male",displayName:"云彪 辽宁",locale:"zh-CN"},{name:"zh-CN-shandong-YunxiangNeural",gender:"male",displayName:"云翔 山东",locale:"zh-CN"},{name:"zh-CN-sichuan-YunxiNeural",gender:"male",displayName:"云希 四川",locale:"zh-CN"}],SelfHostedVoiceList:["de-DE-AmalaNeural","de-DE-BerndNeural","de-DE-ConradNeural","de-DE-KatjaNeural","en-GB-LibbyNeural","en-GB-RyanNeural","en-GB-SoniaNeural","en-US-AmberNeural","en-US-AriaNeural","en-US-ChristopherNeural","en-US-DavisNeural","en-US-EricNeural","en-US-GuyNeural","en-US-JaneNeural","en-US-JennyNeural","en-US-MichelleNeural","en-US-SaraNeural","es-ES-AbrilNeural","es-ES-AlvaroNeural","es-ES-ArnauNeural","es-ES-ElviraNeural","fr-FR-DeniseNeural","fr-FR-HenriNeural","it-IT-BenignoNeural","it-IT-DiegoNeural","it-IT-ElsaNeural","it-IT-IsabellaNeural","ja-JP-KeitaNeural","ja-JP-NanamiNeural","ko-KR-InJoonNeural","ko-KR-SoonBokNeural","ko-KR-SunHiNeural","pt-BR-AntonioNeural","pt-BR-FranciscaNeural","pt-PT-DuarteNeural","pt-PT-RaquelNeural","ru-RU-DariyaNeural","ru-RU-DmitryNeural","ru-RU-SvetlanaNeural","yue-CN-XiaoMinNeural","yue-CN-YunSongNeural","zh-CN-henan-YundengNeural","zh-CN-liaoning-XiaobeiNeural","zh-CN-shaanxi-XiaoniNeural","zh-CN-shandong-YunxiangNeural","zh-CN-sichuan-YunxiNeural","zh-CN-XiaoxiaoNeural","zh-CN-YunxiNeural","zh-HK-HiuMaanNeural","zh-HK-WanLungNeural","zh-TW-HsiaoChenNeural","zh-TW-YunJheNeural","zf_xiaoxiao","zm_yunxi","zf_xiaoni","zf_xiaobei"],CloudDictList:[{id:"basic-english-irish",name:"Basic English-Irish Dictionary",translation:"简明英爱词典",source:"Pat Griffin"},{id:"english-italian",name:"English-Italian Dictionary",translation:"简明英意词典",source:"Pat Griffin"},{id:"cc-cedict",name:"CC-CEDICT",translation:"简明中英词典",source:"www.mdbg.net"},{id:"et-tedict",name:"ET-TEDICT",translation:"简明中英英中词典",source:"cdict-1.0-1.i386.rpm"},{id:"jmdict",name:"Japanese English Dictionary",translation:"简明日英词典",source:"JMDict"},{id:"moby",name:"Moby Thesaurus",translation:"Moby Thesaurus",source:"Chua Welic"},{id:"wordnet",name:"Wordnet",translation:"Wordnet",source:"Chua Welic"},{id:"opted",name:"Online Plain Text English Dictionary",translation:"简明英英词典",source:"Chua Welic"},{id:"english-arabic",name:"English-Arabic Dictionary",translation:"简明英阿词典",source:"Khaldoun Mahmoud"},{id:"tcm_textbook",name:"中医教材仓库",translation:"中医教材仓库",source:"Fredrik Jornebo"},{id:"ecdict",name:"ECDICT",translation:"简明英汉字典增强版",source:"GitHub-skywind3000"}]};class x{constructor(e){this.config=e,this.driveId="",this.taskQueue=new k(1),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getDriveId(){return m(this,void 0,void 0,(function*(){if(this.driveId)return this.driveId;const a=this.config.access_token,t=yield e.post("https://openapi.alipan.com/adrive/v1.0/user/getDriveInfo",{},{headers:{Authorization:`Bearer ${a}`}});return this.driveId=t.data.default_drive_id,this.driveId}))}getFolderIdByPath(a){return m(this,void 0,void 0,(function*(){const t=this.config.access_token,o=yield this.getDriveId();try{try{const i=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(i.data)return i.data.file_id}catch(i){const n=a.split("/").filter((e=>e));let r="",l="root";for(const a of n){r+="/"+a;try{l=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:r},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id}catch(i){l=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:o,parent_file_id:l,name:a,type:"folder",check_name_mode:"refuse"},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id}}return l}}catch(e){return console.error("Error getting/creating folder by path:",e),""}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=yield this.getDriveId(),i=yield this.getFolderIdByPath(this.baseFolder+"/"+a);let n=[],r="",l=!0;for(;l;){const a=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/list",{drive_id:o,parent_file_id:i,marker:r||void 0},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}),s=a.data.items.filter((e=>!e.punish_flag||2!==e.punish_flag))||[];n=n.concat(s),r=a.data.next_marker,l=!!r}return[...new Set(n.map((e=>({name:e.name,size:e.size,type:e.type,modified:e.updated_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=yield this.getDriveId(),i=yield this.getFolderIdByPath(this.baseFolder+"/"+a);return!i||(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/delete",{drive_id:o,file_id:i},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}checkExists(a){var t;return m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=yield this.getDriveId(),n=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:i,file_path:a},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}});(null===(t=n.data)||void 0===t?void 0:t.file_id)&&(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/recyclebin/trash",{drive_id:i,file_id:n.data.file_id},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}))}catch(e){}}))}getAuthUrl(e){return`https://openapi.alipan.com/oauth/authorize?${new URLSearchParams({response_type:"code",client_id:C.adriveClientId,redirect_uri:e,grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}).toString()}`}}class I extends x{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=yield this.getDriveId(),n=t.substring(0,t.lastIndexOf("/")),r=t.substring(t.lastIndexOf("/")+1);yield this.deleteFileWithoutQueue(t);const l=yield this.getFolderIdByPath(this.baseFolder+"/"+n),s=yield a.arrayBuffer(),d=s.byteLength,c=yield crypto.subtle.digest("SHA-1",s),u=Array.from(new Uint8Array(c)).map((e=>e.toString(16).padStart(2,"0"))).join(""),m=(e=>{function a(e,a){const t=(65535&e)+(65535&a);return(e>>16)+(a>>16)+(t>>16)<<16|65535&t}function t(e,t,o,i,n,r){return a((l=a(a(t,e),a(i,r)))<<(s=n)|l>>>32-s,o);var l,s}function o(e,a,o,i,n,r,l){return t(a&o|~a&i,e,a,n,r,l)}function i(e,a,o,i,n,r,l){return t(a&i|o&~i,e,a,n,r,l)}function n(e,a,o,i,n,r,l){return t(a^o^i,e,a,n,r,l)}function r(e,a,o,i,n,r,l){return t(o^(a|~i),e,a,n,r,l)}const l=function(e){const a=e.length,t=1+(a+8>>6),o=new Array(16*t).fill(0);for(let t=0;t>2]|=e.charCodeAt(t)<>2]|=128<{let a="";for(let t=0;t<4;t++)a+=("0"+(e>>8*t&255).toString(16)).slice(-2);return a})).join("")})(o),p=Number(BigInt("0x"+m.slice(0,16))%BigInt(d||1)),h=new Uint8Array(s.slice(p,Math.min(p+8,d))),g=btoa(String.fromCharCode(...h)),f=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:i,parent_file_id:l,name:r,type:"file",check_name_mode:"ignore",size:d,content_hash:u,content_hash_name:"sha1",proof_code:g,proof_version:"v1",part_info_list:[{part_number:1}]},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}),{file_id:y,upload_id:N,rapid_upload:v,part_info_list:b}=f.data;return v?(console.info("阿里云盘秒传成功"),!0):(yield fetch(b[0].upload_url,{method:"PUT",body:s,headers:{"Content-Length":d.toString()}}),yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/complete",{drive_id:i,file_id:y,upload_id:N},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=yield this.getDriveId(),i=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:this.baseFolder+"/"+a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.file_id,n=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/getDownloadUrl",{drive_id:o,file_id:i},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return(yield e.get(n.data.url,{responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}})).data}catch(e){return console.error("Error downloading file:",e),!1}}))))))}}class F{constructor(e){this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getFolderIdByPath(a){return m(this,void 0,void 0,(function*(){if(""==a)return"0";const t=this.config.access_token,o=a.split("/");let i="0";for(const a of o){const o=`https://api.box.com/2.0/folders/${i}/items?fields=id,name&type=folder&limit=1000`;try{const n=(yield e.get(o,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===a&&"folder"===e.type));if(n)i=n.id;else{const o={name:a,parent:{id:i},type:"folder"};i=(yield e.post("https://api.box.com/2.0/folders",o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.id}}catch(e){return console.error("Error occurred during folder creation:",e),""}}return i}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);let i=yield this.getFolderIdByPath(o),n=[],r=0,l=!0;const s=1e3;for(;l;){const a=yield e.get(`https://api.box.com/2.0/folders/${i}/items`,{params:{limit:s,offset:r},headers:{Authorization:`Bearer ${t}`}}),o=a.data.entries||[];n=n.concat(o),r+=o.length,l=o.length===s&&a.data.total_count>r}return[...new Set(n.map((e=>({name:e.name,size:e.size||0,type:e.type,modified:e.content_modified_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=a.substring(0,a.lastIndexOf("/")),i=a.substring(a.lastIndexOf("/")+1);let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const r=yield this.getFolderIdByPath(n);if(!r)return!0;const l=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=file&limit=1000`,s=(yield e.get(l,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===i&&"file"===e.type));return!s||(yield e.delete(`https://api.box.com/2.0/files/${s.id}`,{headers:{Authorization:`Bearer ${t}`}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://account.box.com/api/oauth2/authorize?${new URLSearchParams({response_type:"code",client_id:C.boxClientId,redirect_uri:e,grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}).toString()}`}}class R extends F{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token,i=t.substring(0,t.lastIndexOf("/")),n=t.substring(t.lastIndexOf("/")+1);let r=this.baseFolder+"/"+i;for(;r.startsWith("/");)r=r.substring(1);const l=yield this.getFolderIdByPath(r);if(!l)throw new Error("Folder not found");const s=(yield this.listFiles(i)).find((e=>e===n));s&&(yield this.deleteFileWithoutQueue(i+"/"+n));let d=new File([a],n,{lastModified:(new Date).getTime(),type:a.type});const c=new FormData;c.append("file",d),c.append("parent_id",l);const u=yield e.post("https://upload.box.com/api/2.0/files/content",c,{headers:{Authorization:`Bearer ${o}`,"Content-Type":"multipart/form-data"},params:{if_match:"false",fields:"name,id"},maxContentLength:1/0,maxBodyLength:1/0});return!(u.status>=300)||(console.error("Error occurred during file upload:",u),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=a.substring(0,a.lastIndexOf("/")),i=a.substring(a.lastIndexOf("/")+1);let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const r=yield this.getFolderIdByPath(n);if(!r)return console.error("Folder not found"),!0;const l=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=file&limit=1000`,s=(yield e.get(l,{headers:{Authorization:`Bearer ${t}`}})).data.entries.find((e=>e.name===i&&"file"===e.type));if(!s)return console.error("File not found:",i),!0;const d=yield e({url:`https://api.box.com/2.0/files/${s.id}/content`,method:"get",headers:{Authorization:`Bearer ${t}`},responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return d.status>=300?(console.error("Error occurred during file download:",d),!1):d.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class O{constructor(e){this.config=e,this.taskQueue=new k(3)}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=[],i=!0,n=null;for(;i;){let r;r=n?yield e.post("https://api.dropboxapi.com/2/files/list_folder/continue",{cursor:n},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}}):yield e.post("https://api.dropboxapi.com/2/files/list_folder",{path:"/"+a,limit:2e3},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});const l=r.data.entries||[];o=o.concat(l),i=r.data.has_more,n=r.data.cursor}return[...new Set(o.map((e=>({name:e.name,size:e.size||0,type:e[".tag"],modified:e.client_modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;yield e.post("https://api.dropboxapi.com/2/files/delete_v2",{path:"/"+a},{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://www.dropbox.com/oauth2/authorize?response_type=code&token_access_type=offline&client_id=${C.dropboxClientId}&redirect_uri=${e}`}}class _ extends O{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type});const r=yield e.post("https://content.dropboxapi.com/2/files/upload",n,{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/octet-stream","Dropbox-API-Arg":JSON.stringify({path:"/"+t,mode:"overwrite",autorename:!0,mute:!1})},maxContentLength:1/0,maxBodyLength:1/0});return!(r.status>=300)||(console.error("Error occurred during file upload:",r),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token,o=yield e({url:"https://content.dropboxapi.com/2/files/download",method:"post",headers:{Authorization:`Bearer ${t}`,"Dropbox-API-Arg":JSON.stringify({path:"/"+a})},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return o.status>=300?(console.error("Error occurred during file download:",o),!1):o.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ${constructor(e){this.folderExistsCache=new Set,this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){var t,o;return m(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);let n=[],r=0;const l=1e3;let s=!0;for(;s;){const d=yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:a?`/${a}`:"/",limit:l,offset:r,fields:"_embedded.items.name,_embedded.items.size,_embedded.items.type,_embedded.items.modified,_embedded.total"}}),c=(null===(t=d.data._embedded)||void 0===t?void 0:t.items)||[];n=n.concat(c);const u=(null===(o=d.data._embedded)||void 0===o?void 0:o.total)||0;r+=c.length,s=r({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);const o=yield e.delete("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${t}`,"Content-Type":"application/json"},params:{path:a?`/${a}`:"/",permanently:!1}});return 202===o.status||204===o.status}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(a){var t,o;return m(this,void 0,void 0,(function*(){try{const i=this.config.access_token,n=a.split("/").filter((e=>e.length>0));let r="";for(const a of n)if(r+="/"+a,!this.folderExistsCache.has(r))try{yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:r}}),this.folderExistsCache.add(r)}catch(a){if(404!==(null===(t=a.response)||void 0===t?void 0:t.status))return console.error("Error checking directory:",a),!1;try{yield e.put(`https://cloud-api.yandex.net/v1/disk/resources?path=${encodeURIComponent(r)}`,null,{headers:{Authorization:`OAuth ${i}`}}),this.folderExistsCache.add(r)}catch(e){if(409!==(null===(o=e.response)||void 0===o?void 0:o.status))return console.error("Error creating directory:",e),!1;this.folderExistsCache.add(r)}}return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}getAuthUrl(e){return`https://oauth.yandex.com/authorize?response_type=code&client_id=${C.yandexClientId}&redirect_uri=${e}&force_confirm=true`}}class M extends ${constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=this.baseFolder+"/"+t;for(;i.startsWith("/");)i=i.substring(1);const n=i.substring(0,i.lastIndexOf("/"));if(n){if(!(yield this.ensureDirectoryExists(n)))return console.error("Failed to create directory:",n),!1}const r=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/upload",{headers:{Authorization:`OAuth ${o}`,"Content-Type":"application/json"},params:{path:`/${i}`,overwrite:!0}});if(200!==r.status)return console.error("Error getting upload URL:",r),!1;const l=r.data.href;let s=t.split("/").pop()||"",d=new File([a],s,{lastModified:(new Date).getTime(),type:a.type});const c=yield e.put(l,d,{headers:{"Content-Type":a.type||"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0});return!(c.status>=300)||(console.error("Error occurred during file upload:",c),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);const i=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/download",{headers:{Authorization:`OAuth ${t}`,"Content-Type":"application/json"},params:{path:`/${o}`}});if(200!==i.status)return console.error("Error getting download URL:",i),!1;const n=i.data.href,r=yield e({url:n,method:"get",maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return r.status>=300?(console.error("Error occurred during file download:",r),!1):r.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class U{constructor(e){this.isExp=!1,this.folderIdCache=new Map,this.config=e,this.taskQueue=new k(3),this.isExp=this.config.isExp||!1,this.baseFolder="KoodoReader"}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getFileId(a,t){return m(this,void 0,void 0,(function*(){const o=this.config.access_token,i=`https://www.googleapis.com/drive/v3/files?q=name='${a}'+and+'${t}'+in+parents&fields=files(id,name)`;try{const a=yield e.get(i,{headers:{Authorization:"Bearer "+o}});if(0===a.data.files.length)return"";const t=a.data.files;return t.length>0?t[0].id:null}catch(e){return console.error("Error occurred during file list retrieval:",e),""}}))}checkFolder(a){return m(this,void 0,void 0,(function*(){a=this.baseFolder+"/"+a;const t=this.config.access_token;if(""===a)return"root";if(this.folderIdCache.has(a))return this.folderIdCache.get(a);const o=a.split("/").filter((e=>""!==e.trim()));let i="root",n="";for(const a of o){if(n=n?n+"/"+a:a,this.folderIdCache.has(n)){i=this.folderIdCache.get(n);continue}let o=yield this.getFolderId(a,i);if(!o){const n={name:a,mimeType:"application/vnd.google-apps.folder",parents:[i]};try{o=(yield e.post("https://www.googleapis.com/drive/v3/files",n,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}})).data.id}catch(e){throw console.error(`Error occurred during folder creation for ${a}:`,e),e}}this.folderIdCache.set(n,o),i=o}return i}))}getFolderId(a,t){return m(this,void 0,void 0,(function*(){const o=this.config.access_token,i=`https://www.googleapis.com/drive/v3/files?q=name='${a=encodeURIComponent(a)}'+and+mimeType='application/vnd.google-apps.folder'+and+'${t}'+in+parents&fields=files(id,name)`;try{const a=(yield e.get(i,{headers:{Authorization:`Bearer ${o}`}})).data.files;return a.length>0?a[0].id:null}catch(e){throw console.error("Error occurred during fetching folder ID:",e),e}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=yield this.checkFolder(a),i=[],n="",r=!0;for(;r;){let a=`https://www.googleapis.com/drive/v3/files?q='${o}'+in+parents&fields=nextPageToken,files(id,name,size,mimeType)&pageSize=1000`;n&&(a+=`&pageToken=${n}`);const l=yield e.get(a,{headers:{Authorization:`Bearer ${t}`}}),s=l.data.files||[];i=i.concat(s),n=l.data.nextPageToken,r=!!n}return[...new Set(i.map((e=>({name:e.name,size:e.size||0,type:"application/vnd.google-apps.folder"===e.mimeType?"folder":"file",modified:e.modifiedTime}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQue(e)}))))))}))}deleteFileWithoutQue(a){return m(this,void 0,void 0,(function*(){const t=a.split("/").pop()||"",o=a.split("/").slice(0,-1).join("/"),i=yield this.checkFolder(o),n=this.config.access_token,r=yield this.getFileId(t,i);if(""===r)return console.error("File not found:",t),!0;try{const a=yield e.delete(`https://www.googleapis.com/drive/v3/files/${r}`,{headers:{Authorization:`Bearer ${n}`}});return console.error("File deleted:",a),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${e}&prompt=consent&response_type=code&client_id=${C.googleClientId}&scope=https://www.googleapis.com/auth/${this.isExp?"drive":"drive.file"}&access_type=offline`}}class B extends U{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type}),r=t.split(".").pop(),l=p(r||""),s=t.split("/")[0],d=yield this.checkFolder(s),c=yield this.getFileId(i||"",d);const u={mimeType:l,name:i,parents:[d]},m=c?`https://www.googleapis.com/upload/drive/v3/files/${c}?uploadType=resumable`:"https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable",h=(yield e({method:c?"PATCH":"POST",url:m,data:c?null:JSON.stringify(u),headers:{Authorization:"Bearer "+o,"Content-Type":"application/json; charset=UTF-8"},maxContentLength:1/0,maxBodyLength:1/0})).headers.location,g=yield this.getData(n);if(0===Object.keys(g).length)return!1;const f=yield e.put(h,g.data,{headers:{Authorization:"Bearer "+o,"Content-Type":"application/zip","Content-Range":`bytes 0-${g.fileSize-1}/${g.fileSize}`},maxContentLength:1/0,maxBodyLength:1/0});return!(f.status>=300)||(console.error("Error occurred during file download:",f),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=a.split("/").pop(),i=a.split("/")[0],n=yield this.checkFolder(i),r=yield this.getFileId(o||"",n);if(!r)return console.error("File not found:",o),!0;const l=`https://www.googleapis.com/drive/v3/files/${r}?alt=media`,s=yield e.get(l,{headers:{Authorization:"Bearer "+t},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return s.status>=300?(console.error("Error occurred during file download:",s),!1):s.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getData(e){return m(this,void 0,void 0,(function*(){return e?new Promise(((a,t)=>{const o=new FileReader;o.onload=t=>a({fileName:e.name,mimeType:e.type,fileSize:e.size,data:t.target.result}),o.onerror=e=>t(e),o.readAsArrayBuffer(e)})):{}}))}}class z{constructor(e){this.folderCreationLocks=new Map,this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=2){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getStorage(){return m(this,void 0,void 0,(function*(){if(this.storage)return this.storage;let{email:e,password:t}=this.config;return this.storage=yield new a({email:e,password:t,userAgent:"KoodoReader/1.0"}).ready,this.storage}))}getRoot(){return m(this,void 0,void 0,(function*(){if(this.root)return this.root;const e=(yield this.getStorage()).root;if(""===this.baseFolder)return this.root=e,this.root;let a=e.children.find((e=>e.name===this.baseFolder&&e.directory));return a||(a=yield e.mkdir(this.baseFolder)),this.root=a,this.root}))}createFolder(e,a){return m(this,void 0,void 0,(function*(){const t=`${e.nodeId}_${a}`;if(this.folderCreationLocks.has(t))return yield this.folderCreationLocks.get(t);const o=(()=>m(this,void 0,void 0,(function*(){try{let t=e.children.find((e=>e.name===a&&e.directory));return t||(t=yield e.mkdir(a),t)}finally{this.folderCreationLocks.delete(t)}})))();return this.folderCreationLocks.set(t,o),yield o}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){try{let a=yield this.getRoot();if(e){const t=e.split("/").filter((e=>e));for(const e of t){const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return[];a=t}}return a.children.map((e=>({name:e.name,size:e.size||0,type:e.directory?"folder":"file",modified:e.timestamp?new Date(1e3*e.timestamp).toISOString():""})))}catch(e){return console.error("Error listing MEGA files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return m(this,void 0,void 0,(function*(){try{let a=yield this.getRoot();const t=e.split("/"),o=t.pop();for(const e of t){if(!e)continue;const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return!0;a=t}const i=a.children.find((e=>e.name===o&&!e.directory));return!i||(yield i.delete(),!0)}catch(e){return console.error("Error deleting MEGA file:",e),!1}}))}}class D extends z{constructor(e){super(e)}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{let o=yield this.getRoot();const i=a.split("/"),n=i.pop()||"";for(const e of i){if(!e)continue;let a=o.children.find((a=>a.name===e&&a.directory));a||(a=yield this.createFolder(o,e)),o=a}const r=new File([e],n,{lastModified:(new Date).getTime(),type:e.type}),l=yield e.arrayBuffer(),s=new Uint8Array(l),d=t.from(s),c=o.children.find((e=>e.name===n&&!e.directory));return c&&(yield c.delete()),yield o.upload({name:n,size:r.size},d).complete,!0}catch(e){return console.error("Error occurred during MEGA file upload:",e),!1}}))))))}))}downloadFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let a=yield this.getRoot();const t=e.split("/"),o=t.pop()||"";for(const e of t){if(!e)continue;const t=a.children.find((a=>a.name===e&&a.directory));if(!t)return!0;a=t}const i=a.children.find((e=>e.name===o&&!e.directory));if(!i)return!0;const n=yield i.downloadBuffer();return this.taskQueue.setDownloadedSize(n.size),n.buffer}catch(e){return console.error("Error occurred during MEGA file download:",e),!1}}))))))}))}}class L{constructor(e){this.isExp=!1,this.baseUrl="https://graph.microsoft.com/v1.0/me/drive/special/approot",this.config=e,this.taskQueue=new k(3),this.isExp=this.config.isExp||!1,this.baseUrl=this.isExp?"https://graph.microsoft.com/v1.0/me/drive/root":"https://graph.microsoft.com/v1.0/me/drive/special/approot",void 0===this.config.baseFolder?this.baseFolder=this.isExp?"KoodoReader":"":this.baseFolder=this.config.baseFolder}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);let o,i=[];if(""===a)o=`${this.baseUrl}/children`;else{const e=encodeURIComponent(a);o=`${this.baseUrl}:/${e}:/children`}for(;o;){const a=yield e.get(o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});if(a.status>=300)break;const n=a.data.value||[];i=i.concat(n),o=a.data["@odata.nextLink"]||""}return[...new Set(i.map((e=>({name:e.name,size:e.size||0,type:e.folder?"folder":"file",modified:e.lastModifiedDateTime}))))]}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;for(a=this.baseFolder+"/"+a;a.startsWith("/");)a=a.substring(1);const o=yield e.delete(`${this.baseUrl}:/${a}`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"}});return!(o.status>=300)||(console.error("Error deleting file:",o),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${C.microsoftClientId}&scope=${this.isExp?"files.readwrite.all":"files.readwrite.appfolder"} offline_access&response_type=code&redirect_uri=${e}`}}class P extends L{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.access_token;let i=t.split("/").pop()||"",n=new File([a],i,{lastModified:(new Date).getTime(),type:a.type}),r=this.baseFolder+"/"+t;for(;r.startsWith("/");)r=r.substring(1);const l=this.baseUrl+":/"+r+":/createUploadSession",s=yield e.post(l,null,{headers:{Authorization:"Bearer "+o,"Content-Type":"application/json"},maxContentLength:1/0,maxBodyLength:1/0});let d=n.size;const c=n.type,u=s.data.uploadUrl,m=yield e.put(u,n,{headers:{"Content-Type":c,"Content-Range":`bytes 0-${d-1}/${d}`},maxContentLength:1/0,maxBodyLength:1/0});return!(m.status>=300)||(console.error("Error occurred during file download:",m),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;for(;o.startsWith("/");)o=o.substring(1);const i=`${this.baseUrl}:/${o}:/content`,n=yield e.get(i,{responseType:"arraybuffer",headers:{Authorization:"Bearer "+t},maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error occurred during file download:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class j{downloadFile(e,a){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}listFiles(e){return m(this,void 0,void 0,(function*(){return new Promise((e=>{e([])}))}))}getAuthUrl(){return""}}class K{constructor(e){this.baseUrl="https://api.pcloud.com",this.config=e,this.taskQueue=new k(3),this.baseUrl="2"===e.region?"https://eapi.pcloud.com":"https://api.pcloud.com"}retryOperation(e,a=3){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}checkFolderExists(a,t){return m(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:t,path:`/${a}`}})).data.result}catch(e){return console.error("Error checking folder:",e),!1}}))}createFolder(a,t){return m(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/createfolderifnotexists`,{params:{access_token:t,path:`/${a}`}})).data.result}catch(e){return console.error("Error creating folder:",e),!1}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:t,path:"/"+a,recursive:0}});return 0!==o.data.result?[]:o.data.metadata.contents.map((e=>({name:e.name,size:e.size||0,type:e.isfolder?"folder":"file",modified:e.modified})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/deletefile`,{params:{access_token:t,path:"/"+a}});return 0===o.data.result||(console.error("Error deleting file:",o.data),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://my.pcloud.com/oauth2/authorize?client_id=${C.pcloudClientId}&response_type=code&redirect_uri=${e}`}}class H extends K{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=this.config.refresh_token,i=t.split("/").slice(0,-1).join("/");if(!(yield this.checkFolderExists(i,o))){if(!(yield this.createFolder(i,o)))return!1}let n=t.split("/").pop()||"",r=new File([a],n,{lastModified:(new Date).getTime(),type:a.type});const l=new FormData;l.append("file",r);const s=yield e.post(`${this.baseUrl}/uploadfile`,l,{params:{access_token:o,path:`/${i}`,renew:1},maxContentLength:1/0,maxBodyLength:1/0});return 0===s.data.result||(console.error("Error uploading file:",s.data),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/getfilelink`,{params:{access_token:t,path:`/${a}`}});if(0!==o.data.result)return console.error("Error getting file link:",o.data),!0;const i=`https://${o.data.hosts[0]}${o.data.path}`,n=yield e.get(i,{responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error downloading file:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class J{constructor(e){this.config=e,this.taskQueue=new k(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=0){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}shouldUsePathStyle(){try{if(this.config.forcePathStyle&&"no"!==this.config.forcePathStyle)return!0;let e=this.config.endpoint;const a=new URL(e),t=a.hostname,o=/^(\d{1,3}\.){3}\d{1,3}$/.test(t),i=""!==a.port;return!o&&i}catch(e){return!0}}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){let{endpoint:a,region:t,bucketName:n,accessKeyId:r,secretAccessKey:l,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;let d=s+"/"+e;for(;d.startsWith("/");)d=d.substring(1);""===d||d.endsWith("/")||(d+="/");const c=new o({endpoint:a,region:t,credentials:{accessKeyId:r,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});try{let e,a=[],t=[],o=!0;for(;o;){const r=yield c.send(new i({Bucket:n,Prefix:d,Delimiter:"/",ContinuationToken:e}));r.Contents&&(a=a.concat(r.Contents)),r.CommonPrefixes&&(t=t.concat(r.CommonPrefixes)),e=r.NextContinuationToken,o=!!e}let r=[];return a.forEach((e=>{if(!e.Key.endsWith("/")){const a=e.Key.substring(d.length);a.includes("/")||r.push({name:a,size:e.Size||0,type:"file",modified:e.LastModified?e.LastModified.toISOString():""})}})),t.forEach((e=>{const a=e.Prefix.substring(d.length).replace(/\/$/,"");a&&r.push({name:a,size:0,type:"folder",modified:""})})),r}catch(e){return console.error(e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){let{endpoint:a,region:t,bucketName:i,accessKeyId:r,secretAccessKey:l,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;const d=new o({endpoint:a,region:t,credentials:{accessKeyId:r,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});let c=s+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{return yield d.send(new n({Bucket:i,Key:c})),!0}catch(e){return console.error(e),!1}}))}}class W extends J{constructor(e){super(e)}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:n,accessKeyId:l,secretAccessKey:s,dir:d}=this.config;const c=new o({endpoint:t,region:i,credentials:{accessKeyId:l,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});d=d&&"KoodoReader"===this.baseFolder?d:this.baseFolder;let u=d+"/"+a;for(;u.startsWith("/");)u=u.substring(1);try{let a=yield c.send(new r({Bucket:n,Key:u,Body:e}));return 200===a.$metadata.httpStatusCode||(console.error("Error uploading file:",a),!1)}catch(e){return console.error("Error: ",e),!1}}))))))}))}downloadFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let{endpoint:a,region:t,bucketName:i,accessKeyId:n,secretAccessKey:r,dir:s}=this.config;s=s&&"KoodoReader"===this.baseFolder?s:this.baseFolder;const d=new o({endpoint:a,region:t,credentials:{accessKeyId:n,secretAccessKey:r},forcePathStyle:this.shouldUsePathStyle()});let c=s+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{const e=yield d.send(new l({Bucket:i,Key:c}));if(!e.Body)return console.error("No response body"),!1;const a=yield e.Body.transformToByteArray();return this.taskQueue.setDownloadedSize(a.length),a.buffer}catch(a){return console.error("Error downloading file:",a,e),!1}}))))))}))}}class q{constructor(e){this.config=e,this.taskQueue=new k(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder;a&&""!==a.trim()&&(o=o+"/"+a),o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));let i=[],n=0;const r=1e3;for(;;){const a=yield e.get("https://pan.baidu.com/rest/2.0/xpan/file",{params:{method:"list",access_token:t,dir:"/"+o,start:n,limit:r,order:"name",desc:0,web:1,folder:0},headers:{"User-Agent":"pan.baidu.com"}});if(a.status>=300||0!==a.data.errno){console.error("百度网盘API错误:",a.data);break}const l=a.data.list||[];if(0===l.length)break;if(i=i.concat(l),l.length({name:e.server_filename,size:e.size||0,type:e.isdir?"folder":"file",modified:new Date(1e3*e.server_mtime).toISOString(),path:e.path,fs_id:e.fs_id})))}catch(e){return console.error("获取百度网盘文件列表时发生错误:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));const i=new URLSearchParams({async:"0",filelist:JSON.stringify(["/"+o])}),n=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=filemanager&access_token=${t}&opera=delete`,i.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==n.data.errno)return console.error("百度网盘删除文件API错误:",n.data),-9===n.data.errno?console.error("文件不存在"):111===n.data.errno?console.error("有其他异步任务正在执行"):-7===n.data.errno&&console.error("文件名非法"),!1;const r=n.data.info||[];for(const e of r)if(0!==e.errno)return console.error(`文件删除失败: ${e.path}, 错误码: ${e.errno}`),!1;return!0}catch(e){return console.error("删除文件时发生错误:",e),!1}}))}getAuthUrl(e){return`https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=${C.duboxClientId}&redirect_uri=${e}&scope=basic,netdisk&device_id=119827642&display=page&qrcode=1`}}const G=4194304;class Q extends q{constructor(e){super(e)}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var o;try{const o=this.config.access_token;let i=this.baseFolder+"/"+t;i=i.replace(/\/+/g,"/"),i.startsWith("/")&&(i=i.substring(1));const n=yield a.arrayBuffer(),r=n.byteLength,l=new Uint8Array(n),{contentMd5:s,sliceMd5:d,blockList:c}=this.calculateFileMd5(l,r),u=new URLSearchParams({path:"/"+i,size:r.toString(),isdir:"0",autoinit:"1",rtype:"3",block_list:JSON.stringify(c),"content-md5":s,"slice-md5":d,local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),m=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=${o}`,u.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==m.data.errno)return console.error("预上传失败:",m.data),!1;const p=m.data.uploadid,h=m.data.block_list||[];if(0===h.length)return!0;const g=yield this.getUploadDomain(o,"/"+i,p);if(!g)return console.error("获取上传域名失败"),!1;for(const a of h){const t=a*G,n=Math.min(G,r-t),s=l.slice(t,t+n),d=new FormData;d.append("file",new Blob([s],{type:"application/octet-stream"}),`chunk_${a}`);const u=`${g}/rest/2.0/pcs/superfile2?method=upload&access_token=${o}&type=tmpfile&path=${encodeURIComponent("/"+i)}&uploadid=${p}&partseq=${a}`,m=yield e.post(u,d,{headers:{"User-Agent":"pan.baidu.com"},maxContentLength:1/0,maxBodyLength:1/0,timeout:0});if(m.status>=300)throw new Error(`分片上传失败: ${JSON.stringify(m.data)}`);const h=m.data.md5,f=c[a];h&&h!==f&&console.warn(`分片 ${a} MD5不匹配: 期望 ${f}, 实际 ${h}`)}const f=new URLSearchParams({path:"/"+i,size:r.toString(),isdir:"0",block_list:JSON.stringify(c),uploadid:p,rtype:"3",local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),y=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${o}`,f.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});return 0===y.data.errno||(console.error("创建文件失败:",y.data),!1)}catch(e){return console.error("文件上传过程中发生错误:",(null===(o=e.response)||void 0===o?void 0:o.data)||e.message||e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var t;this.taskQueue.setDownloadedSize(0);try{const o=this.config.access_token;let i=this.baseFolder+"/"+a;i=i.replace(/\/+/g,"/"),i.startsWith("/")&&(i=i.substring(1));const n=yield this.listFileInfos(a.substring(0,a.lastIndexOf("/"))),r=i.split("/").pop(),l=n.find((e=>e.name===r));if(!l)return console.error("文件不存在:",a),!1;const s=yield e.get("https://pan.baidu.com/rest/2.0/xpan/multimedia",{params:{method:"filemetas",access_token:o,fsids:JSON.stringify([l.fs_id]),dlink:1},headers:{"User-Agent":"pan.baidu.com"}});if(0!==s.data.errno||!(null===(t=s.data.list)||void 0===t?void 0:t[0]))return console.error("获取下载链接失败:",s.data),!1;const d=s.data.list[0].dlink;return(yield e.get(d,{responseType:"arraybuffer",params:{access_token:o},headers:{"User-Agent":"pan.baidu.com"},onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}})).data}catch(e){return console.error("下载文件时发生错误:",e),!1}}))))))}))}getUploadDomain(a,t,o){return m(this,void 0,void 0,(function*(){try{const i=yield e.get("https://d.pcs.baidu.com/rest/2.0/pcs/file",{params:{method:"locateupload",appid:"250528",access_token:a,path:t,uploadid:o,upload_version:"2.0"},headers:{"User-Agent":"pan.baidu.com"}});if(0!==i.data.error_code)return console.error("获取上传域名失败:",i.data),null;const n=i.data.servers||[],r=n.find((e=>e.server.startsWith("https://")));return r?r.server:n.length>0?n[0].server:(console.error("没有可用的上传服务器"),null)}catch(e){return console.error("获取上传域名时出错:",e),null}}))}calculateFileMd5(e,a){const t=[];let o="",i=0;for(;i=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}getUploadCredentials(a){return m(this,void 0,void 0,(function*(){try{const t=yield e.get(`${this.baseUrl}/open/upload/get_token`,{headers:{Authorization:`Bearer ${a}`}});return t.status>=300||!t.data.state?(console.error("Error getting upload credentials:",t.data),null):t.data.data}catch(e){return console.error("Error occurred during get upload credentials:",e),null}}))}generateOSSPolicy(e,a,t=new Date(Date.now()+36e5)){const o={expiration:t.toISOString(),conditions:[{bucket:e},{key:a},["starts-with","$success_action_status","2"],["content-length-range",0,1073741824]]};return JSON.stringify(o)}getAuthUrl(e){return`https://passportapi.115.com/open/authorize?client_id=${C.yiyiwuClientId}&response_type=code&redirect_uri=${e}`}}class X extends Y{constructor(e){super(e)}sha1Hex(e){return m(this,void 0,void 0,(function*(){const a=yield crypto.subtle.digest("SHA-1",e);return Array.from(new Uint8Array(a)).map((e=>e.toString(16).padStart(2,"0"))).join("")}))}calculateFileSha1(e){return m(this,void 0,void 0,(function*(){try{const a=yield e.arrayBuffer();return this.sha1Hex(a)}catch(e){return console.error("Error calculating file SHA1:",e),""}}))}calculatePreSha1(e){return m(this,void 0,void 0,(function*(){try{const a=e.slice(0,131072),t=yield a.arrayBuffer();return this.sha1Hex(t)}catch(e){return console.error("Error calculating pre SHA1:",e),""}}))}calculateOSSSignature(e,a){const t=s.enc.Base64.stringify(s.enc.Utf8.parse(a));return s.HmacSHA1(t,e).toString(s.enc.Base64)}handleSecondAuth(e,a,t,o,i,n,r,l){return m(this,void 0,void 0,(function*(){try{if(!a.sign_check)return console.error("No sign_check provided for second authentication"),null;const[s,d]=a.sign_check.split("-"),c=parseInt(s),u=parseInt(d),m=t.slice(c,u+1),p=yield m.arrayBuffer(),h=(yield this.sha1Hex(p)).toUpperCase();return yield this.initializeUpload(e,o,i,n,r,l,a.sign_key,h,a.pick_code)}catch(e){return console.error("Error during second authentication:",e),null}}))}uploadToObjectStorage(a,t,o,i){var n;return m(this,void 0,void 0,(function*(){try{const n=i.endpoint,r=o.bucket,l=o.object;let s;if(n.includes(r))s=n;else{s=`https://${r}.${n.replace(/^https?:\/\//,"")}`}const d=this.generateOSSPolicy(r,l),c=this.calculateOSSSignature(i.AccessKeySecret,d),u=btoa(d),m=new FormData;if(m.append("key",l),m.append("policy",u),m.append("OSSAccessKeyId",i.AccessKeyId),m.append("signature",c),m.append("x-oss-security-token",i.SecurityToken),m.append("success_action_status","200"),o.callback&&o.callback.callback){const e=btoa(o.callback.callback);if(m.append("callback",e),o.callback.callback_var){const e=JSON.parse(o.callback.callback_var);for(const[a,t]of Object.entries(e))m.append(a,String(t))}}const p=new File([a],t,{type:a.type});m.append("file",p);const h=yield e.post(s,m,{maxContentLength:1/0,maxBodyLength:1/0});return 200===h.status||204===h.status||(console.error("Upload failed with status:",h.status),!1)}catch(e){return console.error("Error uploading file via REST API:",(null===(n=e.response)||void 0===n?void 0:n.data)||e.message||e),!1}}))}uploadFile(e,a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){var t;try{const t=this.config.access_token;let o=this.baseFolder+"/"+a;o.startsWith("/")||(o="/"+o);const i=e.size,n=yield this.calculateFileSha1(e),r=yield this.calculatePreSha1(e),l=a.split("/").pop()||a,s=o.substring(0,o.lastIndexOf("/"))||"/";let d=yield this.getFolderInfo(s,!0),c="0";if(d)c=d.file_id;else{let e=yield this.createFolder(s);if(!e)return console.error("Failed to create folder:",s),!1;c=e}yield this.deleteFileWithoutQueue(a);let u=yield this.initializeUpload(c,l,i,n,r,t);if(!u)return console.error("Failed to initialize upload"),!1;if((6===u.status||7===u.status||8===u.status)&&(u=yield this.handleSecondAuth(c,u,e,l,i,n,r,t),!u))return console.error("Second authentication failed"),!1;if(2===u.status)return console.info(`File ${a} uploaded successfully via instant upload.`),!0;const m=yield this.getUploadCredentials(t);if(!m)return console.error("Failed to get upload credentials"),!1;return(yield this.uploadToObjectStorage(e,l,u,m))?(console.info(`File ${a} uploaded successfully.`),!0):(console.error("Failed to upload to object storage"),!1)}catch(e){return console.error("Error occurred during file upload:",(null===(t=e.response)||void 0===t?void 0:t.data)||e.message||e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let t=this.baseFolder+"/"+a;t=t.replace(/\/+/g,"/"),t.startsWith("/")||(t="/"+t);const o=yield this.getFolderInfo(t,!1);if(!o||!o.pick_code)return console.error("Failed to get file info or pick_code for:",a),!1;const i=yield this.getFileDownloadUrl(o.pick_code);if(!i)return console.error("Failed to get download URL for:",a),!1;const n=yield e.get(i.url,{responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error downloading file:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}initializeUpload(a,t,o,i,n,r,l,s,d){return m(this,void 0,void 0,(function*(){try{const c=new FormData;c.append("file_name",t),c.append("file_size",o.toString()),a?c.append("target","U_1_"+a):c.append("target","U_1_0"),c.append("fileid",i),c.append("preid",n),c.append("topupload","0"),d&&c.append("pick_code",d),l&&c.append("sign_key",l),s&&c.append("sign_val",s);const u=yield e.post(`${this.baseUrl}/open/upload/init`,c,{headers:{Authorization:`Bearer ${r}`,"Content-Type":"multipart/form-data"}});return u.status>=300||!u.data.state?(console.error("Error initializing upload:",u.data),null):u.data.data}catch(e){return console.error("Error occurred during upload initialization:",e),null}}))}createFolder(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=a.replace(/^\/+|\/+$/g,"");if(!o)return"";const i=o.split("/");let n="",r="0";for(const a of i){n=n?`${n}/${a}`:a;const o=yield this.getFolderInfo(n,!0);if(o&&o.file_id)r=o.file_id;else{const o=new FormData;o.append("pid",r),o.append("file_name",a);const i=yield e.post(`${this.baseUrl}/open/folder/add`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});if(i.status>=300||!i.data.state)return console.error("Error creating folder:",i.data),"";r=i.data.data.file_id}}return r}catch(e){return console.error("Error occurred during folder creation:",e),""}}))}getFolderInfo(a,t){return m(this,void 0,void 0,(function*(){if(""===a||"/"===a)return{file_id:"0"};a.startsWith("/")||(a="/"+a);try{const t=this.config.access_token,o=new FormData;o.append("path",a);const i=yield e.post(`${this.baseUrl}/open/folder/get_info`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});return i.status>=300||!i.data.state||0===i.data.data.length?(console.error("Error getting file info:",i.data),null):i.data.data}catch(e){return console.error("Error occurred during get file info:",e),null}}))}getFileDownloadUrl(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token,o=new FormData;o.append("pick_code",a);const i=yield e.post(`${this.baseUrl}/open/ufile/downurl`,o,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});if(i.status>=300)return console.error("Error getting download URL:",i.data),null;const n=i.data.data,r=Object.keys(n)[0];return r&&n[r]?n[r].url:(console.error("No file data found in download URL response"),null)}catch(e){return console.error("Error occurred during get download URL:",e.message||e),null}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;(a=this.baseFolder+"/"+a).startsWith("/")||(a="/"+a);let o=[],i=0;const n=1150;let r=!0,l=yield this.getFolderInfo(a,!0),s="";if(l)s=l.file_id;else{let e=yield this.createFolder(a);if(!e)return console.error("Failed to create folder:",a),[];s=e}if(!s)return console.error("Failed to get or create folder ID:",a),[];let d=s;for(;r;){const a={offset:i,limit:n,cur:1,show_dir:1};d&&(a.cid=d);const l=yield e.get(`${this.baseUrl}/open/ufile/files`,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"application/json"},params:a});if(l.status>=300)break;const s=l.data.data||[];o=o.concat(s),s.length({name:e.fn,size:e.fs||0,type:"0"===e.fc?"folder":"file",modified:new Date(1e3*e.upt).toISOString()})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{const t=this.config.access_token;a=this.baseFolder+"/"+a;const o=yield this.getFolderInfo(a,!1);if(!o)return!0;const i=new FormData;i.append("file_ids",o.file_id);const n=yield e.post(`${this.baseUrl}/open/ufile/delete`,i,{headers:{Authorization:`Bearer ${t}`,"Content-Type":"multipart/form-data"}});return!(n.status>=300||!n.data.state)||(console.error("Error deleting file:",n),!1)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}}class V{constructor(e){let{username:a,password:t,url:o,dir:i,AuthType:n,createClient:r}=e;void 0===e.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=e.baseFolder,i=i&&"KoodoReader"===this.baseFolder?i:this.baseFolder,this.username=a,this.password=t,this.url=o,this.dir=i,this.taskQueue=new k(5),this.AuthType=n,this.createClient=r}getClient(){return m(this,void 0,void 0,(function*(){return this.webdavClient||(this.url=yield this.handleUrlRedirection(this.url),this.webdavClient=this.createClient(this.url,{authType:this.AuthType.Password,username:this.username,password:this.password})),this.webdavClient}))}handleUrlRedirection(a){return m(this,void 0,void 0,(function*(){try{const t=yield e.head(a,{maxRedirects:0,validateStatus:()=>!0,timeout:5e3});return t.request&&t.request.responseURL&&t.request.responseURL!==a?t.request.responseURL:t.status>=300&&t.status<400&&t.headers.location?t.headers.location:a}catch(e){return console.info("Error handling URL redirection:",e),a}}))}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){const a=yield this.getClient();try{const t=a.getDirectoryContents(this.dir+"/"+e),o=new Promise(((e,a)=>{setTimeout((()=>a(new Error("WebDAV list directory timeout"))),5e3)}));return(yield Promise.race([t,o])).filter((a=>"."!==a.filename&&".."!==a.filename&&a.filename!==e)).map((e=>({name:e.basename,size:e.size||0,type:"directory"===e.type?"folder":"file",modified:e.lastmod})))}catch(t){return t.response&&404===t.response.status&&(yield a.createDirectory(this.dir+"/"+e)),console.error("Error listing files:",t),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){const a=yield this.getClient();try{return yield a.deleteFile(this.dir+"/"+e),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(e){return m(this,void 0,void 0,(function*(){let a=yield this.getClient();try{const t=e.replace(/^\/+|\/+$/g,"").split("/").filter((e=>e.length>0));let o="";for(const e of t)o=o?`${o}/${e}`:e,(yield a.exists(`/${o}`))||(yield a.createDirectory(`/${o}`));return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}}class Z extends V{constructor(e){super(Object.assign(Object.assign({},e),{AuthType:d,createClient:c}))}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{let o=this.dir+"/"+t,i=yield this.getClient();const n=i.exists(o.substring(0,o.lastIndexOf("/"))),r=new Promise(((e,a)=>{setTimeout((()=>a(new Error("WebDAV exists check timeout"))),5e3)}));!1===(yield Promise.race([n,r]))&&(yield this.ensureDirectoryExists(o.substring(0,o.lastIndexOf("/"))));let l=t.split("/").pop()||"",s=new File([a],l,{lastModified:(new Date).getTime(),type:a.type}),d=i.getFileUploadLink(this.dir+"/"+t);const c=new URL(d);c.search="",d=c.toString();const u=btoa(this.username+":"+this.password),m=yield e.put(d,s,{headers:{Authorization:"Basic "+u},maxContentLength:1/0,maxBodyLength:1/0});return!(m.status>=300)||(console.error("Error occurred during file upload:",m),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){if(this.taskQueue.setDownloadedSize(0),-1===a.indexOf("."))return new ArrayBuffer(0);try{const t=btoa(this.username+":"+this.password);let o=this.url.endsWith("/")?this.url:this.url+"/",i=this.dir.startsWith("/")?this.dir.substring(1):this.dir;const n=yield e({url:o+i+"/"+a,method:"get",headers:{Authorization:"Basic "+t},responseType:"arraybuffer",maxContentLength:1/0,maxBodyLength:1/0,onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return n.status>=300?(console.error("Error occurred during file download:",n),!1):n.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ee{constructor(e){this.username=e.username,this.password=e.password,this.url=e.url,this.taskQueue=new k(3)}retryOperation(e,a=1){return m(this,void 0,void 0,(function*(){let t=0;for(;;){const o=yield e();if(o)return o;if(t>=a)return this.taskQueue.hasFailedTasks=!0,o;t++;const i=1e3*Math.pow(2,t);console.info(`Retry attempt ${t} after ${i}ms`),yield new Promise((e=>setTimeout(e,i)))}}))}listFiles(e){return m(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(a){return m(this,void 0,void 0,(function*(){try{return(yield e.get(`${this.url}/list`,{params:{dir:a},auth:{username:this.username,password:this.password}})).data.files.map((e=>({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modifiedTime})))||[]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(a){return m(this,void 0,void 0,(function*(){try{return(yield e.delete(`${this.url}/delete`,{params:{dir:a.split("/").slice(0,-1).join("/")||"",filename:a.split("/").pop()},auth:{username:this.username,password:this.password}})).data.success}catch(e){return console.error("Error deleting file:",e),!1}}))}}class ae extends ee{constructor(e){super(e)}getAuthHeader(){return`Basic ${btoa(`${this.username}:${this.password}`)}`}uploadFile(a,t){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){try{const o=t.split("/").pop()||"",i=t.substring(0,t.lastIndexOf("/"))||"";let n=this.listFiles("");const r=new Promise(((e,a)=>{setTimeout((()=>a(new Error("Docker connection timeout"))),5e3)}));yield Promise.race([n,r]);let l=new File([a],o,{lastModified:(new Date).getTime(),type:a.type});const s=new FormData;s.append("file",l);const d=yield e.post(`${this.url}/upload?dir=${encodeURIComponent(i)}`,s,{headers:{Authorization:this.getAuthHeader(),"Content-Type":"multipart/form-data"},maxContentLength:1/0,maxBodyLength:1/0});return!(d.status>=300)||(console.error("Error occurred during file upload:",d),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(a){return m(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>m(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const t=a.split("/").pop()||"",o=a.substring(0,a.lastIndexOf("/"))||"",i=yield e({url:`${this.url}/download`,method:"GET",params:{dir:o,filename:t},headers:{Authorization:this.getAuthHeader()},maxContentLength:1/0,maxBodyLength:1/0,responseType:"arraybuffer",onDownloadProgress:e=>{this.taskQueue.setDownloadedSize(e.loaded)}});return i.status>=300?(console.error("Error occurred during file download:",i),!1):i.data}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}const te=["book","config","cover","font"];class oe{constructor(e,a){this.type=e,this.remote="dropbox"===e?new _(a):"microsoft"===e?new P(a):"google"===e?new B(a):"microsoft_exp"===e?new P(Object.assign(Object.assign({},a),{isExp:!0})):"google_exp"===e?new B(Object.assign(Object.assign({},a),{isExp:!0})):"s3compatible"===e?new W(a):"webdav"===e?new Z(a):"docker"===e?new ae(a):"boxnet"===e?new R(a):"mega"===e?new D(a):"adrive"===e?new I(a):"pcloud"===e?new H(a):"dubox"===e?new Q(a):"yandex"===e?new M(a):"yiyiwu"===e?new X(a):new j}downloadFile(e,a){return m(this,void 0,void 0,(function*(){if("cover"!==a){if(!(yield this.listFiles(a)).find((a=>e.indexOf(a)>-1)))return!1}return yield this.remote.downloadFile(a+"/"+e)}))}uploadFile(e,a,t){return m(this,void 0,void 0,(function*(){return 0===t.size||(yield this.remote.uploadFile(t,a+"/"+e))}))}deleteFile(e,a){return m(this,void 0,void 0,(function*(){return!(yield this.listFiles(a)).find((a=>e.indexOf(a)>-1))||(yield this.remote.deleteFile(a+"/"+e))}))}listFiles(e){return m(this,void 0,void 0,(function*(){return yield this.remote.listFiles(e)}))}listFileInfos(e){return m(this,void 0,void 0,(function*(){return yield this.remote.listFileInfos(e)}))}isExist(e,a){return m(this,void 0,void 0,(function*(){return(yield this.listFiles(a)).find((a=>-1!==a.indexOf(e)))}))}downloadAllFiles(){return m(this,void 0,void 0,(function*(){for(let e of te){let a=yield this.listFiles(e);for(let t of a)yield this.downloadFile(t,e)}}))}getAuthUrl(e){return this.remote.getAuthUrl?this.remote.getAuthUrl(e):""}getStats(){return this.remote.taskQueue.getStats()}clearQueue(){return this.remote.taskQueue.clearQueue()}resetCounters(){this.remote.taskQueue.resetCounters()}getDownloadedSize(){return this.remote.taskQueue.getDownloadedSize()}}const ie={words:['ALTER TABLE words ADD COLUMN "sentence" text']},ne={notes:"SELECT * FROM notes WHERE key = ?",bookmarks:"SELECT * FROM bookmarks WHERE key = ?",books:"SELECT * FROM books WHERE key = ?",plugins:"SELECT * FROM plugins WHERE key = ?",words:"SELECT * FROM words WHERE key = ?"},re={notes:"SELECT * FROM notes WHERE bookKey = ?",bookmarks:"SELECT * FROM bookmarks WHERE bookKey = ?",words:"SELECT * FROM words WHERE bookKey = ?",books:"SELECT * FROM books WHERE key = ?"},le={notes:"DELETE FROM notes WHERE bookKey = ?",bookmarks:"DELETE FROM bookmarks WHERE bookKey = ?",words:"DELETE FROM words WHERE bookKey = ?"};function se(e){for(const a in e)e.hasOwnProperty(a)&&(e[`temp-${a}`]=e[a]);return e}const de={notes:e=>{let a=Object.assign({},e);return a.date=JSON.parse(e.date),a.tag=JSON.parse(e.tag),a},bookmarks:e=>e,books:e=>e,plugins:e=>{let a=Object.assign({},e);return e.autoValue||delete a.autoValue,e.langList?a.langList=JSON.parse(e.langList):delete a.langList,e.voiceList?a.voiceList=JSON.parse(e.voiceList):delete a.voiceList,a.config=JSON.parse(e.config),a},words:e=>{let a=Object.assign({},e);return a.date=JSON.parse(e.date),void 0===a.sentence&&(a.sentence=""),a}};var ce={sqlStatement:{createTableStatement:se({notes:'\n CREATE TABLE IF NOT EXISTS "notes" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "chapter" text,\n "chapterIndex" integer,\n "text" text,\n "cfi" text,\n "range" text,\n "notes" text,\n "percentage" text,\n "color" integer,\n "tag" array\n )\n ',bookmarks:'\n CREATE TABLE IF NOT EXISTS "bookmarks" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "cfi" text,\n "label" text,\n "percentage" text,\n "chapter" text\n );\n ',books:'\n CREATE TABLE IF NOT EXISTS "books" (\n "key" text PRIMARY KEY,\n "name" text,\n "author" text,\n "description" text,\n "md5" text,\n "cover" text,\n "format" text,\n "publisher" text,\n "size" integer,\n "page" integer,\n "path" text,\n "charset" text\n );\n ',plugins:'\n CREATE TABLE IF NOT EXISTS "plugins" (\n "key" text PRIMARY KEY,\n "type" text,\n "displayName" text,\n "icon" text,\n "version" text,\n "config" object,\n "autoValue" string,\n "langList" text,\n "voiceList" text,\n "scriptSHA256" text,\n "script" text\n );\n ',words:'\n CREATE TABLE IF NOT EXISTS "words" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "word" text,\n "sentence" text,\n "chapter" text\n );\n '}),migrateStatement:se(ie),getAllStatement:se({notes:"SELECT * FROM notes",bookmarks:"SELECT * FROM bookmarks",books:"SELECT * FROM books",plugins:"SELECT * FROM plugins",words:"SELECT * FROM words"}),getPagedStatement:se({notes:"SELECT * FROM notes LIMIT ? OFFSET ?",bookmarks:"SELECT * FROM bookmarks LIMIT ? OFFSET ?",books:"SELECT * FROM books LIMIT ? OFFSET ?",plugins:"SELECT * FROM plugins LIMIT ? OFFSET ?",words:"SELECT * FROM words LIMIT ? OFFSET ?"}),getCountStatement:se({notes:"SELECT COUNT(*) as count FROM notes",bookmarks:"SELECT COUNT(*) as count FROM bookmarks",books:"SELECT COUNT(*) as count FROM books",plugins:"SELECT COUNT(*) as count FROM plugins",words:"SELECT COUNT(*) as count FROM words"}),saveStatement:se({notes:"INSERT OR REPLACE INTO notes (key, bookKey, chapter, chapterIndex, text, cfi, range, notes, date, percentage, color, tag) VALUES (@key, @bookKey, @chapter, @chapterIndex, @text, @cfi, @range, @notes, @date, @percentage, @color, @tag)",bookmarks:"INSERT OR REPLACE INTO bookmarks (key, bookKey, cfi, label, percentage, chapter) VALUES (@key, @bookKey, @cfi, @label, @percentage, @chapter)",books:"INSERT OR REPLACE INTO books (key, name, author, description, md5, cover, format, publisher, size, page, path, charset) VALUES (@key, @name, @author, @description, @md5, @cover, @format, @publisher, @size, @page, @path, @charset)",plugins:"INSERT OR REPLACE INTO plugins (key, type, displayName, icon, version, config, autoValue, langList, voiceList, scriptSHA256, script) VALUES (@key, @type, @displayName, @icon, @version, @config, @autoValue, @langList, @voiceList, @scriptSHA256, @script)",words:"INSERT OR REPLACE INTO words (key, bookKey, date, word, sentence, chapter) VALUES (@key, @bookKey, @date, @word, @sentence, @chapter)"}),deleteAllStatement:se({notes:"DELETE FROM notes",bookmarks:"DELETE FROM bookmarks",books:"DELETE FROM books",plugins:"DELETE FROM plugins",words:"DELETE FROM words"}),updateStatement:se({notes:"UPDATE notes SET bookKey = @bookKey, chapter = @chapter, chapterIndex = @chapterIndex, text = @text, cfi = @cfi, range = @range, notes = @notes, date = @date, percentage = @percentage, color = @color, tag = @tag WHERE key = @key",bookmarks:"UPDATE bookmarks SET bookKey = @bookKey, cfi = @cfi, label = @label, percentage = @percentage, chapter = @chapter WHERE key = @key",books:"UPDATE books SET name = @name, author = @author, description = @description, md5 = @md5, cover = @cover, format = @format, publisher = @publisher, size = @size, page = @page, path = @path, charset = @charset WHERE key = @key",plugins:"UPDATE plugins SET type = @type, displayName = @displayName, icon = @icon, version = @version, config = @config, autoValue = @autoValue, langList = @langList, voiceList = @voiceList, scriptSHA256 = @scriptSHA256, script = @script WHERE key = @key",words:"UPDATE words SET bookKey = @bookKey, date = @date, word = @word, sentence = @sentence, chapter = @chapter WHERE key = @key"}),deleteStatement:se({notes:"DELETE FROM notes WHERE key = ?",bookmarks:"DELETE FROM bookmarks WHERE key = ?",books:"DELETE FROM books WHERE key = ?",plugins:"DELETE FROM plugins WHERE key = ?",words:"DELETE FROM words WHERE key = ?"}),dropStatement:se({notes:"DROP TABLE IF EXISTS notes",bookmarks:"DROP TABLE IF EXISTS bookmarks",books:"DROP TABLE IF EXISTS books",plugins:"DROP TABLE IF EXISTS plugins",words:"DROP TABLE IF EXISTS words"}),getStatement:se(ne),getByBookKeyStatement:se(re),getByBookKeysStatement:se({notes:e=>`SELECT * FROM notes WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,bookmarks:e=>`SELECT * FROM bookmarks WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,words:e=>`SELECT * FROM words WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")})`}),getKeysStatement:se({notes:"SELECT key FROM notes",bookmarks:"SELECT key FROM bookmarks",books:"SELECT key FROM books",plugins:"SELECT key FROM plugins",words:"SELECT key FROM words"}),getWithSortAndPageStatement:se({notes:(e,a,t,o)=>`SELECT * FROM notes ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,bookmarks:(e,a,t,o)=>`SELECT * FROM bookmarks ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,books:(e,a,t,o)=>`SELECT * FROM books ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,plugins:(e,a,t,o)=>`SELECT * FROM plugins ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`,words:(e,a,t,o)=>`SELECT * FROM words ORDER BY ${e} ${a} LIMIT ${t} OFFSET ${o}`}),getByKeysStatement:se({notes:e=>`SELECT * FROM notes WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,bookmarks:e=>`SELECT * FROM bookmarks WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,plugins:e=>`SELECT * FROM plugins WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`,words:e=>`SELECT * FROM words WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,a)=>`WHEN ? THEN ${a}`)).join(" ")} END`}),deleteByBookKeyStatement:se(le)},jsonToSqlite:se({notes:e=>{let a=Object.assign({},e);return a.date=JSON.stringify(e.date),a.tag=JSON.stringify(e.tag),a},bookmarks:e=>e,books:e=>{let a=Object.assign({},e);return a.page=e.page||0,a},plugins:e=>{let a=Object.assign({},e);return e.autoValue||(a.autoValue=null),e.langList?a.langList=JSON.stringify(e.langList):a.langList=null,e.voiceList?a.voiceList=JSON.stringify(e.voiceList):a.voiceList=null,a.config=JSON.stringify(e.config),a},words:e=>{let a=Object.assign({},e);return a.date=JSON.stringify(e.date),void 0===a.sentence&&(a.sentence=""),a}}),sqliteToJson:se(de)};const ue=E.testUrl,me=E.cloudCNUrl;class pe{constructor(e,a,t){this.TokenService=e,this.ConfigService=a,this.baseUrl="china"===t?me:ue,this.serverRegion=t,this.refreshToken="",this.accessToken="",this.streamPromise=null,this.expiresAt=0}refreshUserToken(){return m(this,void 0,void 0,(function*(){if(this.refreshToken=yield this.TokenService.getToken("refresh_token"),!this.refreshToken)return{code:401,message:"refresh token not found"};let a=(yield e.post(this.baseUrl+"/api/v1/public/user/refresh_token",{refresh_token:this.refreshToken})).data;return 200===a.code&&(yield this.TokenService.setToken("access_token",a.data.access_token),yield this.TokenService.setToken("refresh_token",a.data.refresh_token),yield this.TokenService.setToken("expires_at",(1e3*a.data.expires_at).toString()),this.accessToken=a.data.access_token,this.refreshToken=a.data.refresh_token,this.expiresAt=1e3*a.data.expires_at),a}))}requestWithRetry(e){return m(this,void 0,void 0,(function*(){return pe.requestQueue||(pe.requestQueue=[]),new Promise(((a,t)=>{pe.requestQueue.push({config:e,resolve:a,reject:t}),pe.processingQueue||this.processQueue()}))}))}isTokenValid(){return m(this,void 0,void 0,(function*(){if(this.accessToken||(this.accessToken=(yield this.TokenService.getToken("access_token"))||""),!this.expiresAt){const e=yield this.TokenService.getToken("expires_at");this.expiresAt=e?parseInt(e):(new Date).getTime()+31536e9}return""!==this.accessToken&&this.expiresAt>(new Date).getTime()+6e4}))}processQueue(){return m(this,void 0,void 0,(function*(){if(!pe.processingQueue){pe.processingQueue=!0;try{for(;pe.requestQueue.length>0;){const e=pe.requestQueue.shift();try{let a=yield this.executeRequest(e.config);e.resolve(a)}catch(a){e.reject(a)}}}finally{pe.processingQueue=!1}}}))}executeRequest(a){return m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let t="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);if(a.baseURL=this.baseUrl,a.headers)a.headers.Authorization="Bearer "+this.accessToken,a.headers["X-Request-ID"]=t;else{let e=this.ConfigService.getItem("appVersion"),o=this.ConfigService.getItem("appPlatform");a.headers={Authorization:"Bearer "+this.accessToken,"X-Request-ID":t,"X-App-Version":e||"1.0.0","X-App-Platform":o||"web"}}let o=(yield e(a)).data;if(402===o.code){let t=yield this.refreshUserToken();if(200===t.code){return a.headers=a.headers||{},a.headers.Authorization="Bearer "+this.accessToken,(yield e(a)).data}return t}return 200!==o.code&&console.error("Request error:",o),o}catch(e){return console.error("Request execution error:",e),"Network Error"===e.message?{code:503,message:"network error",data:null,msg:"Network error, please try again later. 网络错误,请稍后再试。"}:{code:500,message:e.message||"Unknown error",msg:e.message||"Unknown error",data:null}}}))}requestWithStream(e,a,t){return m(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let o=this.accessToken||"",i="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((n,r)=>{let l=this.ConfigService.getItem("appVersion"),s=this.ConfigService.getItem("appPlatform");const d=new t(this.baseUrl+e.url,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+o,"X-Request-ID":i,"X-App-Version":l||"1.0.0","X-App-Platform":s||"web"},method:e.method,body:JSON.stringify(e.data),pollingInterval:0});d.addEventListener("open",(()=>{console.info("Connection to OpenAI established.")})),d.addEventListener("message",(e=>m(this,void 0,void 0,(function*(){if(!e.data)return;const t=JSON.parse(e.data);t.done?(d.close(),n(t)):a(t.data)})))),d.addEventListener("error",(e=>{if(console.info("Error:",e),!e.data)return;const t=JSON.parse(e.data);a(t.data),n(t),d.close()}))}))}finally{this.streamPromise=null}})))()),this.streamPromise}))}requestWithFetch(e,a){return m(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>m(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let t=this.accessToken||"",o="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((i,n)=>m(this,void 0,void 0,(function*(){let n=this.ConfigService.getItem("appVersion"),r=this.ConfigService.getItem("appPlatform");var l=new u(this.baseUrl+e.url,{headers:{"Content-Type":"text/plain",Authorization:"Bearer "+t,"X-Request-ID":o,"X-App-Version":n||"1.0.0","X-App-Platform":r||"web"},payload:JSON.stringify(e.data),method:"POST"});l.addEventListener("message",(e=>m(this,void 0,void 0,(function*(){if(!e.data)return;const t=JSON.parse(e.data);t.done?(l.close(),i(t)):a(t.data)})))),l.addEventListener("open",(e=>{console.info(e,"Connection to OpenAI established.")})),l.addEventListener("error",(e=>{if(console.error(e,"Error occurred while connecting to OpenAI"),!e.data)return;const t=JSON.parse(e.data);a(t.data),i(t),l.close()}))}))))}finally{this.streamPromise=null}})))()),this.streamPromise}))}}pe.processingQueue=!1,pe.requestQueue=[];class he extends pe{constructor(e,a,t){super(e,a,t)}getTransStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_trans_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getTransFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_trans_stream",data:e};return yield this.requestWithFetch(t,a)}))}getDictionary(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_dict",data:e};return yield this.requestWithRetry(a)}))}getBatchTrans(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_batch_trans",data:e};return yield this.requestWithRetry(a)}))}getSplitSentence(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_llm_split_sentence",data:e};return yield this.requestWithRetry(a)}))}getAnswerStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_answer_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getAnswerFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_answer_stream",data:e};return yield this.requestWithFetch(t,a)}))}getSummaryStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_sum_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getSummaryFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_sum_stream",data:e};return yield this.requestWithFetch(t,a)}))}getDictionaryStream(e,a,t){return m(this,void 0,void 0,(function*(){const o={method:"post",url:"/api/v1/pro/reader/get_llm_dict_stream",data:e};return yield this.requestWithStream(o,a,t)}))}getDictionaryFetch(e,a){return m(this,void 0,void 0,(function*(){const t={method:"post",url:"/api/v1/pro/reader/get_llm_dict_stream",data:e};return yield this.requestWithFetch(t,a)}))}getGoogleFont(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_google_font",data:e};return yield this.requestWithRetry(a)}))}sendToKindle(e,a){return m(this,void 0,void 0,(function*(){let t=new FormData;t.append("file",e.file),t.append("email",e.email),t.append("file_name",e.fileName);const o={method:"post",url:"/api/v1/pro/reader/send_to_kindle",headers:{"Content-Type":"multipart/form-data"},data:t,onUploadProgress:a?t=>{var o;const i=t.total||(null===(o=e.file)||void 0===o?void 0:o.size)||0;i>0&&a(Math.min(t.loaded/i,1))}:void 0};return yield this.requestWithRetry(o)}))}detectLanguage(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/detect_language",data:e};return yield this.requestWithRetry(a)}))}getTTSAudio(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_tts_audio",data:e};return yield this.executeRequest(a)}))}getOcrResult(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_ocr_result",data:e};return yield this.executeRequest(a)}))}getOcrResultV2(e){return m(this,void 0,void 0,(function*(){let a=new FormData;a.append("file",e.file);const t={method:"post",url:"/api/v1/pro/reader/get_ocr_result_v2",headers:{"Content-Type":"multipart/form-data"},data:a};return yield this.executeRequest(t)}))}analyzeText(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/analyze_text",data:e};return yield this.requestWithRetry(a)}))}getBookMetadata(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/get_book_metadata",data:e};return yield this.requestWithRetry(a)}))}analyzeBookTitle(e){return m(this,void 0,void 0,(function*(){const a={method:"post",url:"/api/v1/pro/reader/analyze_book_title",data:e};return yield this.requestWithRetry(a)}))}}class ge extends pe{constructor(e,a,t){super(e,a,t),this.serverRegion=t}encryptToken(e){return m(this,void 0,void 0,(function*(){let a=e.token,t=v.encode(a),{extracted:o,remaining:i}=function(e){let a="",t="",o=[],i=1;for(;i<=e.length;)o.push(i-1),i*=2;for(let i=0;i-1){let t=a.split("#");e.encrypted_token=t[1]}const t={method:"post",url:"/api/v1/pro/thirdparty/decrypt_token",data:e};let o=yield this.requestWithRetry(t);if(a.indexOf("#")>-1&&o.data&&o.data.token){let e=a.split("#"),t=function(e,a){let t="",o=[],i=1,n=e.length+a.length;for(;i<=n;)o.push(i-1),i*=2;let r=0,l=0;for(let i=0;i{let o="";if("github"===e?o=`https://github.com/login/oauth/authorize?client_id=${C.githubClientId}&redirect_uri=${t}&scope=${T.github.scopes.join(" ")}&response_type=code`:"google"===e?o=`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${t}&prompt=consent&response_type=code&client_id=${C.googleClientId}&scope=${T.google.scopes.join(" ")}&access_type=offline`:"facebook"===e?o=`https://www.facebook.com/v12.0/dialog/oauth?client_id=${C.facebookClientId}&redirect_uri=${t}&scope=&response_type=code`:"microsoft"===e&&(o=`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${C.microsoftClientId}&scope=${T.microsoft.scopes.join(" ")}&response_type=code&redirect_uri=${t}`),"manual"===a)return o;let i=JSON.stringify({deeplink:"desktop"===a?"koodo-reader://callback":"browser"===a?`${C.callbackUrl}#/login`:"",service:e});return`${o}&state=${"state|"+encodeURIComponent(i)}`}};class Ne{static CompareDatabase(e,a,t){return m(this,void 0,void 0,(function*(){let o=Object.keys(e).filter((e=>e.startsWith("database.sqlite.books"))),i=Object.keys(e).filter((e=>e.startsWith("database.sqlite.notes"))),n=Object.keys(e).filter((e=>e.startsWith("database.sqlite.bookmarks"))),r=Object.keys(e).filter((e=>e.startsWith("database.sqlite.plugins"))),l=Object.keys(e).filter((e=>e.startsWith("database.sqlite.words"))),s=Object.keys(a).filter((e=>e.startsWith("database.sqlite.books"))),d=Object.keys(a).filter((e=>e.startsWith("database.sqlite.notes"))),c=Object.keys(a).filter((e=>e.startsWith("database.sqlite.bookmarks"))),u=Object.keys(a).filter((e=>e.startsWith("database.sqlite.plugins"))),m=Object.keys(a).filter((e=>e.startsWith("database.sqlite.words"))),p={books:Array.from(new Set(o.concat(s))),notes:Array.from(new Set(i.concat(d))),bookmarks:Array.from(new Set(n.concat(c))),plugins:Array.from(new Set(r.concat(u))),words:Array.from(new Set(l.concat(m)))},h={books:{save:[],update:[],delete:[],conflict:[],upload:[]},notes:{save:[],update:[],delete:[],conflict:[],upload:[]},bookmarks:{save:[],update:[],delete:[],conflict:[],upload:[]},plugins:{save:[],update:[],delete:[],conflict:[],upload:[]},words:{save:[],update:[],delete:[],conflict:[],upload:[]}},g=["books","notes","bookmarks","plugins","words"];for(let o of g)for(let i of p[o]){let n=i.split(".")[3],r=e[i],l=a[i];r?l?("save"===l.operation&&("update"!==r.operation&&"delete"!==r.operation||h[o].upload.push(n)),"delete"===l.operation&&("save"===r.operation&&(h[o].delete.push(n),e[i]=l),"update"===r.operation&&(r.timel.time&&(h[o].conflict.push(n),"cloud"===t?(h[o].delete.push(n),e[i]=l):h[o].upload.push(n))),r.operation),"update"===l.operation&&("save"===r.operation&&(h[o].update.push(n),e[i]=l),"update"===r.operation&&(r.timel.time&&h[o].upload.push(n)),"delete"===r.operation&&(r.timel.time&&h[o].upload.push(n)))):h[o].upload.push(n):(h[o].save.push(n),e[i]=l)}return{compareResult:h,syncRecords:e}}))}static CompareConfig(e,a,t){return m(this,void 0,void 0,(function*(){let o=Object.keys(e).filter((e=>e.startsWith("config.readerConfig"))),i=Object.keys(e).filter((e=>e.startsWith("config.listConfig"))),n=Object.keys(e).filter((e=>e.startsWith("config.objectConfig"))),r=Object.keys(e).filter((e=>e.startsWith("config.mapConfig"))),l=Object.keys(a).filter((e=>e.startsWith("config.readerConfig"))),s=Object.keys(a).filter((e=>e.startsWith("config.listConfig"))),d=Object.keys(a).filter((e=>e.startsWith("config.objectConfig"))),c=Object.keys(a).filter((e=>e.startsWith("config.mapConfig"))),u={readerConfig:Array.from(new Set(o.concat(l))),listConfig:Array.from(new Set(i.concat(s))),objectConfig:Array.from(new Set(n.concat(d))),mapConfig:Array.from(new Set(r.concat(c)))},m={readerConfig:{update:[],upload:[]},listConfig:{update:[],upload:[]},objectConfig:{update:[],delete:[],conflict:[],save:[],upload:[]},mapConfig:{update:[],delete:[],conflict:[],save:[],upload:[]}},p=["readerConfig","listConfig"];for(let t of p)for(let o of u[t]){let i=o,n=e[o],r=a[o];n?r?n.timer.time&&m[t].upload.push(i):m[t].upload.push(i):(m[t].update.push(i),e[o]=r)}let h=["objectConfig","mapConfig"];for(let o of h)for(let i of u[o]){let n=i,r=e[i],l=a[i];r?l?("delete"===l.operation&&("update"===r.operation&&(r.timel.time&&(m[o].conflict.push(n),"cloud"===t?(m[o].delete.push(n),e[i]=l):m[o].upload.push(n))),r.operation),"update"===l.operation&&("update"===r.operation&&(r.timel.time&&m[o].upload.push(n)),"delete"===r.operation&&(r.timel.time&&m[o].upload.push(n)))):m[o].upload.push(n):(m[o].update.push(n),e[i]=l)}return{compareResult:m,syncRecords:e}}))}static compareAll(e,a,t,o,i){return m(this,void 0,void 0,(function*(){let n="cloud";if("yes"===t.getReaderConfig("isKeepLocal")){n="local";let e=t.getObjectConfig(yield o.getFingerprint(),"cloudSyncTime",{time:0,conflictMode:"cloud"}),a=yield i.getCloudConfig("config"),r=JSON.parse(a.cloudSyncTime||"{}");delete r[yield o.getFingerprint()],Object.values(r).filter((a=>"local"===a.conflictMode&&a.time>e.time)).length>0&&(n="cloud")}let{compareResult:r,syncRecords:l}=yield this.CompareDatabase(e,a,n),{compareResult:s,syncRecords:d}=yield this.CompareConfig(l,a,n),c=Object.assign(Object.assign({},r),s);return t.setAllSyncRecord(d),"local"===n&&(c.books.conflict.length>0||c.notes.conflict.length>0||c.bookmarks.conflict.length>0||c.plugins.conflict.length>0||c.words.conflict.length>0||c.objectConfig.conflict.length>0||c.mapConfig.conflict.length>0)?t.setObjectConfig(yield o.getFingerprint(),{time:(new Date).getTime(),conflictMode:"local"},"cloudSyncTime"):t.setObjectConfig(yield o.getFingerprint(),{time:(new Date).getTime(),conflictMode:"cloud"},"cloudSyncTime"),c}))}static startSync(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){let r=yield this.syncConfig(e,a,t,i,n,o);if(e.books.save.length>0||e.books.upload.length>0){let e=yield this.syncCover(a,n,i),t=yield this.syncBook(a,i);return[...r,...e,...t]}return r}))}static syncConfig(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){let r=[];for(let a of h){if(e[a].save.length+e[a].update.length>0){let o=yield n.getCloudDatabase(a);for(let i of e[a].save){let e=o.find((e=>e.key===i));e&&(yield t.saveRecord(e,a))}for(let i of e[a].update){let e=o.find((e=>e.key===i));e&&(yield t.updateRecord(e,a,!1))}}if(e[a].delete.length>0)for(let n of e[a].delete)"books"===a&&(yield o.deleteOfflineBook(n),yield i.deleteOfflineCover(n)),yield t.deleteRecord(n,a);yield t.dumpDatabase(a,!0)}if(e.readerConfig.update.length>0||e.listConfig.update.length>0||e.objectConfig.update.length>0||e.mapConfig.update.length>0){let t=yield n.getCloudConfig("config");for(let o of e.readerConfig.update){let e=o.split(".")[3];t.readerConfig&&a.setReaderConfig(e,JSON.parse(t.readerConfig)[e],!1)}for(let o of e.listConfig.update){let e=o.split(".")[3];t[e]&&a.setAllListConfig(JSON.parse(t[e]),e,!1)}for(let o of e.objectConfig.update){let e=o.split(".")[3],i=o.split(".")[2];t[i]&&JSON.parse(t[i])&&JSON.parse(t[i])[e]&&a.setObjectConfig(e,JSON.parse(t[i])[e],i,!1)}for(let o of e.mapConfig.update){let e=o.split(".")[3],i=o.split(".")[2];if(t[i]&&JSON.parse(t[i])&&JSON.parse(t[i])[e]){let o=JSON.parse(t[i])[e];a.setOneMapConfig(e,o,i,!1)}}}if(e.objectConfig.delete.length>0||e.mapConfig.delete.length>0){for(let t of e.objectConfig.delete){let e=t.split(".")[3],o=t.split(".")[2];a.deleteObjectConfig(e,o)}for(let t of e.mapConfig.delete){let e=t.split(".")[3],o=t.split(".")[2];a.deleteMapConfig(e,o)}}for(let a of h)e[a].upload.length>0&&r.push((()=>n.uploadDatabase(a)));return r.push((()=>n.uploadConfig("config"))),r.push((()=>n.uploadConfig("sync"))),r}))}static syncCover(e,a,t){return m(this,void 0,void 0,(function*(){let t=yield a.getLocalCoverList(),o=yield a.getCloudCoverList(),i=Array.from(new Set([...t,...o])),n=[];for(let r of i)t.includes(r)&&!o.includes(r)&&n.push((()=>a.uploadCover(r))),!t.includes(r)&&o.includes(r)&&"adrive"!==e.getItem("defaultSyncOption")&&n.push((()=>a.downloadCover(r)));return n}))}static syncBook(e,a){return m(this,void 0,void 0,(function*(){let t=yield a.getLocalBookList(),o=yield a.getCloudBookList(),i=[],n=Array.from(new Set([...t,...o]));for(let r of n){if(t.includes(r)&&!o.includes(r)){let e=r.split(".")[0],t=r.split(".")[1];i.push((()=>a.uploadBook(e,t)))}let n="yes"===e.getReaderConfig("autoOffline");if(!t.includes(r)&&o.includes(r)&&n&&"adrive"!==e.getItem("defaultSyncOption")){let e=r.split(".")[0],t=r.split(".")[1]||"epub";i.push((()=>a.offlineBook(e,t.toUpperCase())))}}return i}))}static runTasksWithLimit(e,a,t){return m(this,void 0,void 0,(function*(){if("ftp"!==t&&"adrive"!==t){const t=[],o=[];for(const i of e){const e=i().then((a=>(o.splice(o.indexOf(e),1),a)));t.push(e),o.push(e),o.length>=a&&(yield Promise.race(o))}return Promise.all(t)}for(let a of e)yield a()}))}}class ve{constructor(e,a){this.bookKey="",this.sessionStart=0,this.unregisterUnload=null,this.configService=e,this.platform=a}getDailySeconds(e,a){const t=((this.configService.getAllMapConfig("readingStats")||{})[a]||[]).find((a=>a.startsWith(e+"-")));if(!t)return 0;const o=t.split("-");return parseInt(o[o.length-1],10)||0}setDailySeconds(e,a,t){const o=(this.configService.getAllMapConfig("readingStats")||{})[a]||[],i=`${e}-${t}`,n=o.filter((a=>!a.startsWith(e+"-")));this.configService.setOneMapConfig(a,[...n,i],"readingStats")}start(e){this.bookKey=e,this.sessionStart=Date.now(),this.unregisterUnload=this.platform.registerUnloadHandler((()=>{var e,a;this.commit(),null===(a=(e=this.platform).onBeforeClose)||void 0===a||a.call(e)}))}stop(){var e;this.commit(),null===(e=this.unregisterUnload)||void 0===e||e.call(this),this.unregisterUnload=null,this.bookKey="",this.sessionStart=0}commit(){if(!this.bookKey||!this.sessionStart)return;const e=Date.now()-this.sessionStart;if(e<1e3)return void(this.sessionStart=0);const a=Math.round(e/1e3);this.sessionStart=0;const t=this.configService.getObjectConfig(this.bookKey,"readingTime",0);this.configService.setObjectConfig(this.bookKey,t+a,"readingTime");const o=function(){const e=new Date;return`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,"0")}-${String(e.getDate()).padStart(2,"0")}`}(),i=this.getDailySeconds(this.bookKey,o);this.setDailySeconds(this.bookKey,o,i+a)}getTotalSeconds(e){return this.configService.getObjectConfig(e,"readingTime",0)}getDailySecondsForBook(e,a){return this.getDailySeconds(e,a)}getDayStats(e){return((this.configService.getAllMapConfig("readingStats")||{})[e]||[]).map((e=>{const a=e.lastIndexOf("-");return{bookKey:e.substring(0,a),seconds:parseInt(e.substring(a+1),10)||0}}))}getAllDates(){const e=this.configService.getAllMapConfig("readingStats");return Object.keys(e||{})}}const be="Koodo Reader",ke="application/vnd.koreader.v1+json";class Se extends Error{constructor(e,a,t,o){super(e),this.name="KOReaderRequestError",this.status=a,this.code=t,this.body=o}}const Ee=e=>{const a=(e||"").trim();if(!a)return"";return(/^https?:\/\//i.test(a)?a:`https://${a}`).replace(/\/+$/,"")},Ce=e=>{const a="number"==typeof e?e:parseFloat((e||"0")+"");return!isFinite(a)||isNaN(a)?0:a>1&&a<=100?Math.min(Math.max(a/100,0),1):Math.min(Math.max(a,0),1)},Te=(e,a={})=>m(void 0,void 0,void 0,(function*(){const t=yield fetch(e,a);return t.ok||(yield(e=>m(void 0,void 0,void 0,(function*(){let a=null;try{a=yield e.json()}catch(t){try{a=yield e.text()}catch(e){a=null}}const t=(null==a?void 0:a.message)||(null==a?void 0:a.error)||(null==a?void 0:a.msg)||("string"==typeof a?a:"")||e.statusText||"Request failed";throw console.error(`[KOReader] HTTP ${e.status} error: ${t}`,null!=a?a:"(no body)"),new Se(t,e.status,null==a?void 0:a.code,a)})))(t)),204===t.status?{}:yield t.json()})),we=e=>({Accept:ke,"Content-Type":"application/json","x-auth-user":e.username,"x-auth-key":e.passwordHash});class Ae{constructor(e,a,t){this.getKOReaderSyncConfig=()=>{let e;try{e=this.ConfigService.getObjectConfig("koReaderSyncConfig","thirdpartyToken",{})}catch(e){return console.error("[KOReader] Failed to read koReaderSyncConfig:",e),null}if(!e||"object"!=typeof e)return console.error("[KOReader] koReaderSyncConfig is missing or invalid"),null;const a=Ee(e.serverUrl||""),t=(e.username||"").trim(),o=(e.passwordHash||"").trim();return a&&t&&o?{serverUrl:a,username:t,passwordHash:o}:(console.error("[KOReader] Incomplete config — missing fields"),null)},this.getLocalRecordLocation=e=>this.ConfigService.getObjectConfig(e,"recordLocation",{})||{},this.persistKOReaderMetadata=(e,a,t)=>{const o=Object.assign(Object.assign({},a),{percentage:t.percentage.toString(),xpath:t.progress,timestamp:t.timestamp||parseInt(Date.now()/1e3+"")});this.ConfigService.setObjectConfig(e,o,"recordLocation")},this.authUser=e=>m(this,void 0,void 0,(function*(){return yield Te(`${e.serverUrl}/users/auth`,{method:"GET",headers:we(e)})})),this.createUser=e=>m(this,void 0,void 0,(function*(){return yield Te(`${e.serverUrl}/users/create`,{method:"POST",headers:{Accept:ke,"Content-Type":"application/json"},body:JSON.stringify({username:e.username,password:e.passwordHash})})})),this.getBookProgress=(e,a)=>m(this,void 0,void 0,(function*(){const t=yield Te(`${e.serverUrl}/syncs/progress/${encodeURIComponent(a)}`,{method:"GET",headers:we(e)});return t&&0!==Object.keys(t).length?{document:a,percentage:Ce(t.percentage),progress:t.progress||"",device:t.device||"",device_id:t.device_id||"",timestamp:t.timestamp||0}:null})),this.updateBookProgress=(e,a)=>m(this,void 0,void 0,(function*(){yield Te(`${e.serverUrl}/syncs/progress`,{method:"PUT",headers:we(e),body:JSON.stringify({document:a.document,percentage:a.percentage,progress:a.progress,device:a.device||be,device_id:a.device_id||"",timestamp:a.timestamp||parseInt(Date.now()/1e3+"")})})})),this.buildLocalUploadPayload=(e,a,t,o)=>m(this,void 0,void 0,(function*(){const i=Ce(a.percentage),n=a.xpath||"",r=this.ConfigService.getObjectConfig(e.key,"koreaderBooks",{});if(!r.document){let a=yield o(e);if(!a)return console.error(`[KOReader] Cannot build upload payload for "${e.name}": failed to compute partial MD5`),null;r.document=a,this.ConfigService.setObjectConfig(e.key,r,"koreaderBooks")}return n?{document:r.document,percentage:i,progress:n,device:be,device_id:t,timestamp:a.timestamp||parseInt(Date.now()/1e3+"")}:(console.error(`[KOReader] Cannot build upload payload for "${e.name}": no xpath/progress recorded (localRecord.xpath is empty)`),null)})),this.resolveDeviceId=()=>m(this,void 0,void 0,(function*(){try{return(yield this.TokenService.getFingerprint())||"koodo-reader"}catch(e){return console.error("[KOReader] Failed to get device fingerprint, using fallback ID:",e),"koodo-reader"}})),this.verifyAndBuildKOReaderSyncConfig=e=>m(this,void 0,void 0,(function*(){const a={serverUrl:Ee(e.serverUrl),username:(e.username||"").trim(),passwordHash:(e.password||"").trim()?s.MD5((e.password||"").trim()).toString():(e.passwordHash||"").trim()};if(!a.serverUrl||!a.username||!a.passwordHash)throw new Error("Please fill in all fields");try{return yield this.authUser(a),a}catch(e){console.error(`[KOReader] Auth failed for user "${a.username}" at ${a.serverUrl}, attempting to create user:`,e);try{return yield this.createUser(a),yield this.authUser(a),a}catch(o){if((t=o)instanceof Se&&(2002===t.code||(t.message||"").toLowerCase().includes("already exists")))throw console.error(`[KOReader] User "${a.username}" already exists but auth failed. Original auth error:`,e),e;throw console.error(`[KOReader] Failed to create user "${a.username}":`,o),o}}var t})),this.syncKOReaderProgress=e=>m(this,void 0,void 0,(function*(){const a=this.getKOReaderSyncConfig();if(!a)throw new Error("Please configure the KOReader sync server first");yield this.authUser(a);const t=yield this.resolveDeviceId(),o=(yield this.DatabaseService.getAllRecords("books"))||[],i={checkedBooks:0,matchedBooks:0,pulledBooks:0,pushedBooks:0,skippedBooks:0};for(const n of o)try{i.checkedBooks++;const o=this.getLocalRecordLocation(n.key);if(!o||!o.xpath){console.error(`[KOReader] Skipping "${n.name}": no local reading progress (xpath) found`),i.skippedBooks++;continue}const r=this.ConfigService.getObjectConfig(n.key,"koreaderBooks",{});if(!r.document){let a=yield e(n);if(!a){console.error(`[KOReader] Skipping "${n.name}": failed to compute partial MD5 for document ID`),i.skippedBooks++;continue}r.document=a,this.ConfigService.setObjectConfig(n.key,r,"koreaderBooks")}let l=r.document;const s=yield this.getBookProgress(a,l),d=(null==s?void 0:s.timestamp)||0,c=o.timestamp||0;if(s){if(i.matchedBooks++,d>c)this.persistKOReaderMetadata(n.key,o,s),i.pulledBooks++;else{if(!(d{if("number"!=typeof e){const[a,t]=e.split("-");return{styleType:a,color:t}}if(e>=0&&e-1,t=parseInt(xe[e].split("-")[1]);return{styleType:a?"background":"underline",color:a?Ie[t]:Fe[t]}}return{styleType:"background",color:"#FEF3CD"}},this.formatHighlightValue=e=>`${e.styleType}-${e.color}`,this.getNoteHighlightString=()=>this.ConfigService.getReaderConfig(Me)||"background-#FEF3CD",this.getNoteHighlightValue=()=>{const e=this.getNoteHighlightString();if(!e)return Ue;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveNoteHighlightValue=e=>{this.ConfigService.setReaderConfig(Me,`${e.styleType}-${e.color}`)},this.getTtsHighlightString=()=>this.ConfigService.getReaderConfig(_e)||Re,this.getTtsHighlightValue=()=>{const e=this.getTtsHighlightString();if(!e)return Oe;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveTtsHighlightValue=e=>{this.ConfigService.setReaderConfig(_e,`${e.styleType}-${e.color}`)},this.getSearchHighlightString=()=>this.ConfigService.getReaderConfig($e)||Re,this.getSearchHighlightValue=()=>{const e=this.ConfigService.getReaderConfig($e);if(!e)return Oe;const[a,t]=e.split("-");return{styleType:a,color:t}},this.saveSearchHighlightValue=e=>{this.ConfigService.setReaderConfig($e,`${e.styleType}-${e.color}`)},this.buildHighlightStyleForType=(e,a,t)=>{let o="background",i="#FEF3CD";if("number"==typeof e){if(e>=0&&e-1,t=parseInt(xe[e].split("-")[1]);o=a?"background":"underline",i=a?Ie[t]:Fe[t]}}else o=e.split("-")[0],i=e.split("-")[1];const n="background"===o?((e,a)=>{const t=e.replace("#",""),o=3===t.length?t.split("").map((e=>e+e)).join(""):t;return 6!==o.length?e:`rgba(${parseInt(o.slice(0,2),16)}, ${parseInt(o.slice(2,4),16)}, ${parseInt(o.slice(4,6),16)}, ${a})`})(i,.8):i;switch(o){case"background":return a?`background: ${n}; mix-blend-mode: multiply;`:`background: ${n};`;case"underline":return a?t?`border-right: 2px solid ${n};`:`border-bottom: 2px solid ${n};`:`text-decoration: underline; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return a?`background: linear-gradient(transparent calc(50% - 1px), ${n} calc(50% - 1px), ${n} calc(50% + 1px), transparent calc(50% + 1px));`:t?`background: linear-gradient(to right, transparent calc(50% - 1px), ${n} calc(50% - 1px), ${n} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const e=i.replace("#","%23");if(a){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${e}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(t){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${e}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${n}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${n};`}},this.buildHighlightPreviewStyle=(e,a)=>{switch(e){case"background":default:return{background:a};case"underline":return{textDecoration:"underline",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"};case"strikethrough":return{textDecoration:"line-through",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"};case"wavy":return{textDecorationLine:"underline",textDecorationStyle:"wavy",textDecorationColor:a,textDecorationThickness:"2px",textDecorationSkipInk:"none"}}},this.convertNumberToHighlightValue=e=>this.getHighlightValue(e),this.buildTtsHighlightStyle=(e,a)=>this.buildHighlightStyleForType(this.getTtsHighlightString(),e,a),this.buildTtsHighlightPreviewStyle=(e,a)=>this.buildHighlightPreviewStyle(e,a),this.buildSearchHighlightStyle=(e,a)=>this.buildHighlightStyleForType(this.getSearchHighlightString(),e,a),this.buildSearchHighlightPreviewStyle=(e,a)=>this.buildHighlightPreviewStyle(e,a),this.ConfigService=e}}const ze=(De=class{static getItem(e){return localStorage.getItem(e)}static setItem(e,a){localStorage.setItem(e,a)}static removeItem(e){localStorage.removeItem(e)}},Le="browser",class extends De{static getReaderConfig(e){return w.includes(e)&&"undefined"!=typeof window&&window.currentBookKey&&this.getAllListConfig("seperateStyleBooks").includes(window.currentBookKey)?this.getObjectConfig(window.currentBookKey,"seperateStyleConfig",{})[e]:JSON.parse(this.getItem("readerConfig")||"{}")[e]}static setReaderConfig(e,a,t=!0){if(w.includes(e)&&"undefined"!=typeof window&&window.currentBookKey&&this.getAllListConfig("seperateStyleBooks").includes(window.currentBookKey)){let o=this.getObjectConfig(window.currentBookKey,"seperateStyleConfig",{});return o[e]=a,void this.setObjectConfig(window.currentBookKey,o,"seperateStyleConfig",t)}let o=JSON.parse(this.getItem("readerConfig")||"{}");o[e]=a,this.setItem("readerConfig",JSON.stringify(o)),t&&this.setSyncRecord({type:"config",catergory:"readerConfig",name:Le,key:e},{operation:"update",time:Date.now()})}static getAllListConfig(e){return("{}"!==this.getItem(e)&&this.getItem(e)?JSON.parse(this.getItem(e)||""):[])||[]}static deleteListConfig(e,a){let t=this.getAllListConfig(a);const o=t.indexOf(e);o>-1&&t.splice(o,1),this.setAllListConfig(t,a)}static setListConfig(e,a){let t=this.getAllListConfig(a);const o=t.indexOf(e);o>-1?(t.splice(o,1),t.unshift(e)):t.unshift(e),this.setAllListConfig(t,a)}static setAllListConfig(e,a,t=!0){this.setItem(a,JSON.stringify(e)),t&&this.setSyncRecord({type:"config",catergory:"listConfig",name:"general",key:a},{operation:"update",time:Date.now()})}static setObjectConfig(e,a,t,o=!0){let i=this.getAllObjectConfig(t);i[e]=a,o&&this.setSyncRecord({type:"config",catergory:"objectConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllObjectConfig(i,t)}static getObjectConfig(e,a,t){return this.getAllObjectConfig(a)[e]||t}static getAllObjectConfig(e){let a=this.getItem(e);return JSON.parse(a)||{}}static setAllObjectConfig(e,a){this.setItem(a,JSON.stringify(e))}static deleteObjectConfig(e,a){let t=this.getAllObjectConfig(a);delete t[e],this.setSyncRecord({type:"config",catergory:"objectConfig",name:a,key:e},{operation:"delete",time:Date.now()}),this.setAllObjectConfig(t,a)}static getAllMapConfig(e){let a=this.getItem(e);return JSON.parse(a)||{}}static getMapConfig(e,a){return this.getAllMapConfig(a)[e]||[]}static setAllMapConfig(e,a){this.setItem(a,JSON.stringify(e))}static setMapConfig(e,a,t){let o=this.getAllMapConfig(t);void 0===o[e]&&(o[e]=[]),a&&-1===o[e].indexOf(a)&&o[e].unshift(a),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,t)}static setOneMapConfig(e,a,t,o=!0){let i=this.getAllMapConfig(t);i[e]=a,o&&this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(i,t)}static deleteFromMapConfig(e,a,t){let o=this.getAllMapConfig(t),i=o[e].indexOf(a);o[e].splice(i,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,t)}static deleteFromAllMapConfig(e,a){let t=this.getAllMapConfig(a);Object.keys(t).forEach((o=>{let i=t[o].indexOf(e);i>-1&&(t[o].splice(i,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:a,key:o},{operation:"update",time:Date.now()}))})),this.setAllMapConfig(t,a)}static deleteMapConfig(e,a){let t=this.getAllMapConfig(a);delete t[e],this.setSyncRecord({type:"config",catergory:"mapConfig",name:a,key:e},{operation:"delete",time:Date.now()}),this.setAllMapConfig(t,a)}static getFromAllMapConfig(e,a){let t=this.getAllMapConfig(a),o=[];for(let a in t)t[a]&&t[a].indexOf(e)>-1&&o.push(a);return o}static getSyncRecord(e){return JSON.parse(this.getItem("syncRecord")||"{}")[e.type+"."+e.catergory+"."+e.name+"."+e.key]||{operation:"",time:0}}static getAllSyncRecord(){return JSON.parse(this.getItem("syncRecord")||"{}")}static setSyncRecord(e,a){const t=e.type+"."+e.catergory+"."+e.name+"."+e.key;let o=JSON.parse(this.getItem("syncRecord")||"{}");o[t]=a,this.setItem("syncRecord",JSON.stringify(o))}static setAllSyncRecord(e){this.setItem("syncRecord",JSON.stringify(e))}});var De,Le;class Pe{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("notionSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Notion] notionSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Notion] Failed to read notionSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableNotionSync")}resolveDatabaseId(e,a){return m(this,void 0,void 0,(function*(){const t=yield fetch(`https://api.notion.com/v1/blocks/${a}/children`,{method:"GET",headers:{Authorization:`Bearer ${e}`,"Notion-Version":"2022-06-28"}});if(!t.ok){const e=yield t.json().catch((()=>null));throw console.error(`[Notion] resolveDatabaseId failed for page ${a}: HTTP ${t.status} ${t.statusText}`,JSON.stringify(e)),new Error(`Notion resolve database error: ${t.status} ${t.statusText}`)}const o=yield t.json(),i=(o.results||[]).find((e=>"child_database"===e.type));if(!i)throw console.error(`[Notion] No child_database block found under page ${a}. Available block types:`,JSON.stringify((o.results||[]).map((e=>e.type)))),new Error(`No child database found in page ${a}. Please provide a Database ID directly.`);return i.id}))}findOrCreatePage(e,a,t){return m(this,void 0,void 0,(function*(){const o=`${t}`,i=yield fetch(`https://api.notion.com/v1/databases/${a}/query`,{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({filter:{property:"title",title:{equals:o}}})});if(!i.ok){const o=yield i.json().catch((()=>({})));if(400===i.status&&"validation_error"===(null==o?void 0:o.code)&&"string"==typeof(null==o?void 0:o.message)&&o.message.includes("is a page, not a database")){console.error(`[Notion] Provided databaseId "${a}" is a page, not a database. Resolving child database...`);const o=yield this.resolveDatabaseId(e,a);return this.findOrCreatePage(e,o,t)}throw console.error(`[Notion] Database query failed for databaseId "${a}" (book: "${t}"): HTTP ${i.status} ${i.statusText}`,JSON.stringify(o)),new Error(`Notion API error: ${i.status} ${i.statusText}`)}const n=yield i.json();if(n.results&&n.results.length>0)return n.results[0].id;const r=yield fetch("https://api.notion.com/v1/pages",{method:"POST",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({parent:{database_id:a},properties:{title:{title:[{text:{content:o}}]}}})});if(!r.ok){const e=yield r.json().catch((()=>null));throw console.error(`[Notion] Failed to create page for book "${t}" in database "${a}": HTTP ${r.status} ${r.statusText}`,JSON.stringify(e)),new Error(`Notion create page error: ${r.status} ${r.statusText}`)}return(yield r.json()).id}))}appendBlocks(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=!t.notes||0===t.notes.length,n=[];n.push({object:"block",type:"divider",divider:{}}),o&&n.push({object:"block",type:"heading_3",heading_3:{rich_text:[{type:"text",text:{content:o}}]}}),n.push({object:"block",type:"quote",quote:{rich_text:[{type:"text",text:{content:t.text||""}}]}}),!i&&t.notes&&n.push({object:"block",type:"paragraph",paragraph:{rich_text:[{type:"text",text:{content:`📝 ${t.notes}`}}]}});const r=`${t.date.year}-${String(t.date.month).padStart(2,"0")}-${String(t.date.day).padStart(2,"0")}`;n.push({object:"block",type:"paragraph",paragraph:{rich_text:[{type:"text",text:{content:`Added on ${r}`},annotations:{italic:!0,color:"gray"}}]}});const l=yield fetch(`https://api.notion.com/v1/blocks/${a}/children`,{method:"PATCH",headers:{Authorization:`Bearer ${e}`,"Content-Type":"application/json","Notion-Version":"2022-06-28"},body:JSON.stringify({children:n})});if(!l.ok){const e=yield l.json().catch((()=>null));throw console.error(`[Notion] Failed to append blocks to page ${a}: HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),new Error(`Notion append blocks error: ${l.status} ${l.statusText}`)}}))}syncNote(e,a){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const t=this.getConfig();if(!t)return!1;try{const o=yield this.findOrCreatePage(t.token,t.databaseId,a);return yield this.appendBlocks(t.token,o,e,e.chapter||""),!0}catch(e){return console.error(`[Notion] Sync failed for book "${a}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class je{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("yuqueSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Yuque] yuqueSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Yuque] Failed to read yuqueSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableYuqueSync")}generateDocSlug(e){return m(this,void 0,void 0,(function*(){const a=(e||"").trim()||"untitled",t=a.toLowerCase().replace(/[^a-z0-9_.-]/g,"-").replace(/[-_.]{2,}/g,"-").replace(/^[-_.]+|[-_.]+$/g,"")||"book",o=(yield y(a)).slice(0,16),i=t,n=190-o.length-1;return`${i.substring(0,n).replace(/^[-_.]+|[-_.]+$/g,"")||"book"}-${o}`}))}findOrCreateDoc(e,a,t){return m(this,void 0,void 0,(function*(){const o=`${t}`,i=yield this.generateDocSlug(t);try{const t=yield fetch(`${je.API_BASE}/repos/${a}/docs/${i}`,{method:"GET",headers:{"X-Auth-Token":e,"Content-Type":"application/json"}});if(t.ok){const e=yield t.json();return{id:e.data.id,slug:e.data.slug,body:e.data.body||""}}if(404!==t.status){const e=yield t.json().catch((()=>null));console.error(`[Yuque] Unexpected error fetching doc "${i}" in repo "${a}": HTTP ${t.status} ${t.statusText}`,JSON.stringify(e))}}catch(e){console.error(`[Yuque] Network error fetching doc "${i}" in repo "${a}":`,JSON.stringify(e))}const n=yield fetch(`${je.API_BASE}/repos/${a}/docs`,{method:"POST",headers:{"X-Auth-Token":e,"Content-Type":"application/json"},body:JSON.stringify({title:o,slug:i,body:`# ${o}\n\n`,format:"markdown"})});if(!n.ok){const e=yield n.json().catch((()=>null));throw console.error(`[Yuque] Failed to create doc "${o}" in repo "${a}": HTTP ${n.status} ${n.statusText}`,JSON.stringify(e)),new Error(`Yuque create doc error: ${n.status} ${n.statusText}`)}const r=yield n.json();return{id:r.data.id,slug:r.data.slug,body:r.data.body||""}}))}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="\n---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}updateDoc(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${je.API_BASE}/repos/${a}/docs/${t}`,{method:"PUT",headers:{"X-Auth-Token":e,"Content-Type":"application/json"},body:JSON.stringify({body:o,format:"markdown"})});if(!i.ok){const e=yield i.json().catch((()=>null));throw console.error(`[Yuque] Failed to update doc ${t} in repo "${a}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),new Error(`Yuque update doc error: ${i.status} ${i.statusText}`)}}))}syncNote(e,a){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const t=this.getConfig();if(!t)return!1;try{const o=yield this.findOrCreateDoc(t.token,t.namespace,a),i=this.formatNoteMarkdown(e),n=o.body+i;return yield this.updateDoc(t.token,t.namespace,o.id,n),!0}catch(e){return console.error(`[Yuque] Sync failed for book "${a}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}je.API_BASE="https://www.yuque.com/api/v2";class Ke{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("readwiseSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Readwise] readwiseSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Readwise] Failed to read readwiseSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableReadwiseSync")}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=`${a}`,n=!e.notes||0===e.notes.length,r={text:e.text||"",title:i,author:t||"Unknown",source_type:"koodo-reader",category:"books",highlighted_at:`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`};if(!n&&e.notes&&(r.note=e.notes),e.chapter){const a=parseInt(e.chapter,10);isNaN(a)||(r.location_type="order",r.location=a)}try{const e=yield fetch(`${Ke.API_BASE}/highlights/`,{method:"POST",headers:{Authorization:`Token ${o.accessToken}`,"Content-Type":"application/json"},body:JSON.stringify({highlights:[r]})});if(!e.ok){const a=yield e.json().catch((()=>null));throw console.error(`[Readwise] Failed to sync highlight for book "${i}": HTTP ${e.status} ${e.statusText}`,JSON.stringify(a)),new Error(`Readwise API error: ${e.status} ${e.statusText}`)}return!0}catch(a){return console.error(`[Readwise] Sync failed for book "${i}" (text: "${(e.text||"").substring(0,50)}..."):`,JSON.stringify(a instanceof Error?a.message:a)),!1}}))}}Ke.API_BASE="https://readwise.io/api/v2";class He{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("imaSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[IMA] imaSyncConfig is empty or not set"),null):e}catch(e){return console.error("[IMA] Failed to read imaSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableImaSync")}getHeaders(e){return{"Content-Type":"application/json","ima-openapi-clientid":e.clientId,"ima-openapi-apikey":e.apiKey}}formatNoteMarkdown(e,a,t){const o=!e.notes||0===e.notes.length,i=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let n="\n---\n\n";return e.chapter&&(n+=`### ${e.chapter}\n\n`),n+=`> ${e.text||""}\n\n`,!o&&e.notes&&(n+=`**Note:** ${e.notes}\n\n`),n+=`*${i}*\n`,n}findNoteByTitle(e,a){var t,o,i,n;return m(this,void 0,void 0,(function*(){try{const r=JSON.stringify({search_type:0,query_info:{title:a},start:0,end:20}),l=yield fetch(`${He.API_BASE}/search_note`,{method:"POST",headers:this.getHeaders(e),body:r});if(!l.ok){const e=yield l.json().catch((()=>null));return console.error(`[IMA] search_note failed for title "${a}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),null}const s=yield l.json();if(0!==s.code)return console.error(`[IMA] search_note returned error code ${s.code} for title "${a}":`,JSON.stringify(null!==(t=s.msg)&&void 0!==t?t:s)),null;const d=((null===(o=s.data)||void 0===o?void 0:o.search_note_infos)||[]).find((e=>{var t;return a.includes(null===(t=e.note_book_info)||void 0===t?void 0:t.title.replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu,""))}));return null!==(n=null===(i=null==d?void 0:d.note_book_info)||void 0===i?void 0:i.note_id)&&void 0!==n?n:null}catch(e){return console.error(`[IMA] Network error in search_note for title "${a}":`,JSON.stringify(e)),null}}))}createNote(e,a,t){var o,i,n;return m(this,void 0,void 0,(function*(){try{const r={content_format:1,content:`# ${a}\n\n${t}`};e.folderId&&(r.folder_id=e.folderId);const l=yield fetch(`${He.API_BASE}/import_doc`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify(r)});if(!l.ok){const e=yield l.json().catch((()=>null));return console.error(`[IMA] import_doc failed for note "${a}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),null}const s=yield l.json();return 0!==s.code?(console.error(`[IMA] import_doc returned error code ${s.code} for note "${a}":`,JSON.stringify(null!==(o=s.msg)&&void 0!==o?o:s)),null):null!==(n=null===(i=s.data)||void 0===i?void 0:i.note_id)&&void 0!==n?n:null}catch(e){return console.error(`[IMA] Network error in import_doc for note "${a}":`,JSON.stringify(e)),null}}))}appendNote(e,a,t){var o;return m(this,void 0,void 0,(function*(){try{const i=yield fetch(`${He.API_BASE}/append_doc`,{method:"POST",headers:this.getHeaders(e),body:JSON.stringify({note_id:a,content_format:1,content:t})});if(!i.ok){const e=yield i.json().catch((()=>null));return console.error(`[IMA] append_doc failed for noteId "${a}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),!1}const n=yield i.json();return 0===n.code||(console.error(`[IMA] append_doc returned error code ${n.code} for noteId "${a}":`,JSON.stringify(null!==(o=n.msg)&&void 0!==o?o:n)),!1)}catch(e){return console.error(`[IMA] Network error in append_doc for noteId "${a}":`,JSON.stringify(e)),!1}}))}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=this.formatNoteMarkdown(e,a,t);let n=yield this.findNoteByTitle(o,a);if(n){const e=yield this.appendNote(o,n,i);return e||console.error(`[IMA] Failed to append to existing note "${a}" (noteId: ${n})`),e}return n=yield this.createNote(o,a,i),n||console.error(`[IMA] Failed to create note for book "${a}"`),null!==n}))}}He.API_BASE="https://ima.qq.com/openapi/note/v1";class Je{constructor(e){this.configService=e}getConfig(){try{const e=this.configService.getObjectConfig("siyuanSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[SiYuan] siyuanSyncConfig is empty or not set"),null):e}catch(e){return console.error("[SiYuan] Failed to read siyuanSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableSiYuanSync")}getHeaders(e){return{"Content-Type":"application/json",Authorization:`Token ${e}`}}findOrCreateNotebook(e,a){var t,o;return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/notebook/lsNotebooks`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({})});if(!i.ok){const a=yield i.json().catch((()=>null));throw console.error(`[SiYuan] lsNotebooks failed at ${e}: HTTP ${i.status} ${i.statusText}`,JSON.stringify(a)),new Error(`SiYuan list notebooks failed: ${i.status} ${i.statusText}`)}const n=yield i.json();if(0!==n.code)throw console.error(`[SiYuan] lsNotebooks returned error code ${n.code}:`,JSON.stringify(n.msg)),new Error(`SiYuan list notebooks error: ${n.msg}`);const r=(null!==(o=null===(t=n.data)||void 0===t?void 0:t.notebooks)&&void 0!==o?o:[]).find((e=>"Koodo Reader"===e.name));if(r)return r.id;const l=yield fetch(`${e}/api/notebook/createNotebook`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({name:"Koodo Reader"})});if(!l.ok){const a=yield l.json().catch((()=>null));throw console.error(`[SiYuan] createNotebook failed at ${e}: HTTP ${l.status} ${l.statusText}`,JSON.stringify(a)),new Error(`SiYuan create notebook failed: ${l.status} ${l.statusText}`)}const s=yield l.json();if(0!==s.code)throw console.error(`[SiYuan] createNotebook returned error code ${s.code}:`,JSON.stringify(s.msg)),new Error(`SiYuan create notebook error: ${s.msg}`);return s.data.notebook.id}))}findOrCreateDoc(e,a,t,o,i,n){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/query/sql`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({stmt:`SELECT id FROM blocks WHERE type='d' AND hpath='${o.replace(/'/g,"''")}' LIMIT 1`})});if(i.ok){const e=yield i.json();if(0!==e.code)console.error(`[SiYuan] SQL query for doc "${o}" returned error code ${e.code}:`,JSON.stringify(e.msg));else if(e.data&&e.data.length>0)return e.data[0].id}else{const e=yield i.json().catch((()=>null));console.error(`[SiYuan] SQL query for doc "${o}" failed: HTTP ${i.status} ${i.statusText}`,JSON.stringify(e))}const r=n?`**Author:** ${n}\n`:"",l=yield fetch(`${e}/api/filetree/createDocWithMd`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({notebook:t,path:o,markdown:r})});if(!l.ok){const e=yield l.json().catch((()=>null));throw console.error(`[SiYuan] createDocWithMd failed for "${o}" in notebook "${t}": HTTP ${l.status} ${l.statusText}`,JSON.stringify(e)),new Error(`SiYuan create doc failed: ${l.status} ${l.statusText}`)}const s=yield l.json();if(0!==s.code)throw console.error(`[SiYuan] createDocWithMd returned error code ${s.code} for "${o}":`,JSON.stringify(s.msg)),new Error(`SiYuan create doc error: ${s.msg}`);return s.data}))}appendMarkdownToDoc(e,a,t,o){return m(this,void 0,void 0,(function*(){const i=yield fetch(`${e}/api/block/appendBlock`,{method:"POST",headers:this.getHeaders(a),body:JSON.stringify({data:o,dataType:"markdown",parentID:t})});if(!i.ok){const e=yield i.json().catch((()=>null));throw console.error(`[SiYuan] appendBlock failed for docId "${t}": HTTP ${i.status} ${i.statusText}`,JSON.stringify(e)),new Error(`SiYuan append block failed: ${i.status} ${i.statusText}`)}const n=yield i.json();if(0!==n.code)throw console.error(`[SiYuan] appendBlock returned error code ${n.code} for docId "${t}":`,JSON.stringify(n.msg)),new Error(`SiYuan append block error: ${n.msg}`)}))}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}sanitizePathComponent(e){return e.replace(/[\\/:*?"<>|]/g,"_").trim()}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const{serverUrl:i,token:n}=o;if(!i||!n)return console.error("[SiYuan] Sync skipped: config is missing serverUrl or token",JSON.stringify({hasServerUrl:!!i,hasToken:!!n})),!1;try{const o=yield this.findOrCreateNotebook(i,n),r=`/${this.sanitizePathComponent(a)}`,l=yield this.findOrCreateDoc(i,n,o,r,a,t),s=this.formatNoteMarkdown(e);return yield this.appendMarkdownToDoc(i,n,l,s),!0}catch(e){return console.error(`[SiYuan] Sync failed for book "${a}" at ${o.serverUrl}:`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class We{constructor(e,a){this.databaseService=e,this.notionSync=new Pe(a),this.yuqueSync=new je(a),this.readwiseSync=new Ke(a),this.imaSync=new He(a),this.siyuanSync=new Je(a)}getExtraServices(){return[]}getEnabledServices(){const e=[];return this.notionSync.isEnabled()&&e.push({name:"Notion",sync:this.notionSync.syncNote.bind(this.notionSync)}),this.yuqueSync.isEnabled()&&e.push({name:"Yuque",sync:this.yuqueSync.syncNote.bind(this.yuqueSync)}),this.readwiseSync.isEnabled()&&e.push({name:"Readwise",sync:this.readwiseSync.syncNote.bind(this.readwiseSync)}),this.imaSync.isEnabled()&&e.push({name:"IMA",sync:this.imaSync.syncNote.bind(this.imaSync)}),this.siyuanSync.isEnabled()&&e.push({name:"SiYuan",sync:this.siyuanSync.syncNote.bind(this.siyuanSync)}),[...e,...this.getExtraServices()]}syncNote(e,a){return m(this,void 0,void 0,(function*(){const t=this.getEnabledServices();if(0===t.length)return;let o="Unknown Book",i="";if(a||e.bookKey)try{const t=yield this.databaseService.getRecord(a||e.bookKey,"books");t&&t.name&&(o=t.name),t&&t.author&&(i=t.author)}catch(t){console.error(`[NoteSync] Failed to resolve book info for key: ${a||e.bookKey}`,JSON.stringify(t))}const n=(yield Promise.allSettled(t.map((a=>m(this,void 0,void 0,(function*(){var t,n,r,l;try{const r=yield a.sync(e,o,i);return r||console.error(`[NoteSync] ${a.name} sync returned false for book "${o}" (noteId: ${null!==(n=null!==(t=e.noteKey)&&void 0!==t?t:e.key)&&void 0!==n?n:"unknown"})`),{name:a.name,success:r}}catch(t){return console.error(`[NoteSync] ${a.name} sync threw an error for book "${o}" (noteId: ${null!==(l=null!==(r=e.noteKey)&&void 0!==r?r:e.key)&&void 0!==l?l:"unknown"}):`,JSON.stringify(t)),{name:a.name,success:!1}}})))))).filter((e=>"rejected"===e.status||"fulfilled"===e.status&&!e.value.success)).map((e=>"fulfilled"===e.status?e.value.name:"Unknown"));n.length>0&&console.error(`[NoteSync] Sync failed for services: ${n.join(", ")} | book: "${o}"`)}))}}class qe{constructor(e,a,t){this.configService=e,this.fs=a,this.path=t}getConfig(){try{const e=this.configService.getObjectConfig("markdownSyncConfig","thirdpartyToken",{});return 0===Object.keys(e).length?(console.error("[Markdown] markdownSyncConfig is empty or not set"),null):e}catch(e){return console.error("[Markdown] Failed to read markdownSyncConfig:",JSON.stringify(e)),null}}isEnabled(){return"yes"===this.configService.getReaderConfig("isEnableMarkdownSync")}formatNoteMarkdown(e){const a=!e.notes||0===e.notes.length,t=`${e.date.year}-${String(e.date.month).padStart(2,"0")}-${String(e.date.day).padStart(2,"0")}`;let o="\n---\n\n";return e.chapter&&(o+=`### ${e.chapter}\n\n`),o+=`> ${e.text||""}\n\n`,!a&&e.notes&&(o+=`📝 ${e.notes}\n\n`),o+=`*Added on ${t}*\n\n`,o}sanitizeFileName(e){return e.replace(/[\\/:*?"<>|]/g,"_").trim()}syncNote(e,a,t){return m(this,void 0,void 0,(function*(){if(!this.isEnabled())return!1;const o=this.getConfig();if(!o)return!1;const i=o.folder;if(!i)return console.error("[Markdown] Sync skipped: markdownSyncConfig.folder is not set"),!1;const n=this.fs,r=this.path;try{const o=this.sanitizeFileName(a),l=r.join(i,`${o}.md`);if(!n.existsSync(l)){const e=`# ${a}\n`,o=t?`**Author:** ${t}\n\n`:"\n";try{n.writeFileSync(l,e+o,"utf-8")}catch(e){return console.error(`[Markdown] Failed to create file "${l}" for book "${a}":`,JSON.stringify(e)),!1}}const s=this.formatNoteMarkdown(e);try{n.appendFileSync(l,s,"utf-8")}catch(e){return console.error(`[Markdown] Failed to append to file "${l}" for book "${a}":`,JSON.stringify(e)),!1}return!0}catch(e){return console.error(`[Markdown] Sync failed for book "${a}" in folder "${i}":`,JSON.stringify(e instanceof Error?e.message:e)),!1}}))}}class Ge extends We{constructor(e,a,t,o){super(e,a),this.markdownSync=new qe(a,t,o)}getExtraServices(){return this.markdownSync.isEnabled()?[{name:"Markdown",sync:this.markdownSync.syncNote.bind(this.markdownSync)}]:[]}}class Qe{constructor(a){this.syncWordToEudic=(a,t)=>m(this,void 0,void 0,(function*(){var o,i,n,r,l,s,d,c,u,m;if("yes"===this.configService.getReaderConfig("isEnableEudicSync"))try{let c;try{c=this.configService.getObjectConfig("eudicSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[Eudic] Failed to read eudicSyncConfig:",JSON.stringify(e))}if(!c||!c.accessToken)return void console.error("[Eudic] Sync skipped: config is missing or accessToken is not set",JSON.stringify({hasConfig:!!c}));const u=c.language||"en",m={Authorization:`NIS ${c.accessToken}`,"Content-Type":"application/json","User-Agent":"Mozilla/5.0"};let p="0";const h=(c.categoryName||"").trim();if(h)if(void 0!==c.categoryId)p=c.categoryId;else try{const a=(null===(o=(yield e.get(`https://api.frdic.com/api/open/v1/studylist/category?language=${u}`,{headers:m})).data)||void 0===o?void 0:o.data)||[],t=a.find((e=>e.name===h));t?p=t.id:console.error(`[Eudic] Category "${h}" not found among available categories:`,JSON.stringify(a.map((e=>e.name))));const i=Object.assign(Object.assign({},c),{categoryId:p});this.configService.setObjectConfig("eudicSyncConfig",i,"thirdpartyToken")}catch(e){console.error("[Eudic] Failed to fetch category list:",null===(i=null==e?void 0:e.response)||void 0===i?void 0:i.status,JSON.stringify(null!==(r=null===(n=null==e?void 0:e.response)||void 0===n?void 0:n.data)&&void 0!==r?r:e))}try{yield e.post("https://api.frdic.com/api/open/v1/studylist/word",{language:u,word:a,context_line:t||"",category_ids:[p]},{headers:m})}catch(e){throw console.error(`[Eudic] Failed to add word "${a}" to study list (category: ${p}):`,null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,JSON.stringify(null!==(d=null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.data)&&void 0!==d?d:e)),e}}catch(e){console.error("[Eudic] Sync error for word:",a,null===(c=null==e?void 0:e.response)||void 0===c?void 0:c.status,JSON.stringify(null!==(m=null===(u=null==e?void 0:e.response)||void 0===u?void 0:u.data)&&void 0!==m?m:e))}})),this.syncWordToAnki=(a,t,o,i,n="")=>m(this,void 0,void 0,(function*(){var r,l,s,d,c,u,m,p,h,g;if("yes"===this.configService.getReaderConfig("isEnableAnkiSync"))try{let h;try{h=this.configService.getObjectConfig("ankiSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[Anki] Failed to read ankiSyncConfig:",JSON.stringify(e))}if(!h||!h.deckName)return void console.error("[Anki] Sync skipped: config is missing or deckName is not set",JSON.stringify({hasConfig:!!h}));const g=h.host||"127.0.0.1",f=`http://${g}:${h.port||"8765"}`,y=h.deckName,N="Koodo Reader Word",v=(a,t={})=>{const o={action:a,version:6,params:t};return h.apiKey&&(o.key=h.apiKey),e.post(f,o)};if(!h.modelName)try{const e=yield v("modelNames");if(!((null===(r=e.data)||void 0===r?void 0:r.result)||[]).includes(N))try{yield v("createModel",{modelName:N,inOrderFields:["Word","Sentence","Book","Chapter","Definition"],cardTemplates:[{Name:"Card 1",Front:"{{Word}}

{{Sentence}}

{{Book}}
{{Chapter}}",Back:"{{Definition}}"}]})}catch(e){throw console.error(`[Anki] Failed to create model "${N}":`,JSON.stringify(null!==(s=null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.data)&&void 0!==s?s:e)),e}this.configService.setObjectConfig("ankiSyncConfig",Object.assign(Object.assign({},h),{modelName:N}),"thirdpartyToken")}catch(e){throw console.error(`[Anki] Failed to fetch model names from ${f}:`,JSON.stringify(null!==(c=null===(d=null==e?void 0:e.response)||void 0===d?void 0:d.data)&&void 0!==c?c:e)),e}try{const e=yield v("addNote",{note:{deckName:y,modelName:N,fields:{Word:a,Sentence:t||"",Book:o||"",Chapter:i||"",Definition:n||""},options:{allowDuplicate:!1},tags:[]}});(null===(u=e.data)||void 0===u?void 0:u.error)&&console.error(`[Anki] addNote returned an error for word "${a}" in deck "${y}":`,JSON.stringify(e.data.error))}catch(e){throw console.error(`[Anki] Failed to add note for word "${a}" to deck "${y}" at ${f}:`,JSON.stringify(null!==(p=null===(m=null==e?void 0:e.response)||void 0===m?void 0:m.data)&&void 0!==p?p:e)),e}}catch(e){console.error("[Anki] Sync error for word:",a,JSON.stringify(null!==(g=null===(h=null==e?void 0:e.response)||void 0===h?void 0:h.data)&&void 0!==g?g:e))}})),this.syncWordToMaiMemo=a=>m(this,void 0,void 0,(function*(){var t,o,i,n,r,l,s,d,c,u,m,p,h,g,f,y,N,v,b,k;if("yes"===this.configService.getReaderConfig("isEnableMaiMemoSync"))try{let v;try{v=this.configService.getObjectConfig("maimemoSyncConfig","thirdpartyToken",{})}catch(e){return void console.error("[MaiMemo] Failed to read maimemoSyncConfig:",JSON.stringify(e))}if(!v||!v.accessToken||!v.notepadName)return void console.error("[MaiMemo] Sync skipped: config is missing accessToken or notepadName",JSON.stringify({hasConfig:!!v}));const b=v.accessToken,k=v.notepadName.trim(),S={Authorization:`Bearer ${b}`,"Content-Type":"application/json",Accept:"application/json"};let E=v.notepadId||"";if(!E)try{const l=yield e.get("https://open.maimemo.com/open/api/v1/memo/notepads",{headers:S}),s=((null===(o=null===(t=l.data)||void 0===t?void 0:t.data)||void 0===o?void 0:o.notepads)||[]).find((e=>"PUBLISHED"===e.status&&e.title===k));if(s)E=s.id;else{if(E=null===(r=null===(n=null===(i=(yield e.post("https://open.maimemo.com/open/api/v1/memo/notepads",{notepad:{status:"PUBLISHED",content:a,title:k,brief:k,tags:[]}},{headers:S})).data)||void 0===i?void 0:i.data)||void 0===n?void 0:n.notepad)||void 0===r?void 0:r.id,!E)return void console.error("[MaiMemo] Created notepad but no id returned")}this.configService.setObjectConfig("maimemoSyncConfig",Object.assign(Object.assign({},v),{notepadId:E}),"thirdpartyToken")}catch(e){return void console.error("[MaiMemo] Failed to resolve notepadId:",null===(l=null==e?void 0:e.response)||void 0===l?void 0:l.status,JSON.stringify(null!==(d=null===(s=null==e?void 0:e.response)||void 0===s?void 0:s.data)&&void 0!==d?d:e))}try{let t="";try{t=(null===(m=null===(u=null===(c=(yield e.get(`https://open.maimemo.com/open/api/v1/memo/notepads/${E}`,{headers:S})).data)||void 0===c?void 0:c.data)||void 0===u?void 0:u.notepad)||void 0===m?void 0:m.content)||""}catch(e){return void console.error("[MaiMemo] Failed to fetch notepad content:",null===(p=null==e?void 0:e.response)||void 0===p?void 0:p.status,JSON.stringify(null!==(g=null===(h=null==e?void 0:e.response)||void 0===h?void 0:h.data)&&void 0!==g?g:e))}const o=t.split("\n").map((e=>e.trim())).filter((e=>e.length>0));if(o.includes(a))return;o.push(a),yield e.post(`https://open.maimemo.com/open/api/v1/memo/notepads/${E}`,{id:E,notepad:{status:"PUBLISHED",content:o.join("\n"),title:k,brief:k,tags:[]}},{headers:S})}catch(e){throw console.error(`[MaiMemo] Failed to add word "${a}" to notepad "${k}" (${E}):`,null===(f=null==e?void 0:e.response)||void 0===f?void 0:f.status,JSON.stringify(null!==(N=null===(y=null==e?void 0:e.response)||void 0===y?void 0:y.data)&&void 0!==N?N:e)),e}}catch(e){console.error("[MaiMemo] Sync error for word:",a,null===(v=null==e?void 0:e.response)||void 0===v?void 0:v.status,JSON.stringify(null!==(k=null===(b=null==e?void 0:e.response)||void 0===b?void 0:b.data)&&void 0!==k?k:e))}})),this.configService=a}}class Ye extends Qe{}export{S as CommonTool,ze as ConfigService,Be as HighlightUtil,Ae as KOReaderUtil,A as KookitConfig,ye as LoginHelper,Ge as NoteSyncManager,he as ReaderRequest,ve as ReadingTimeUtil,ce as SqlStatement,Ne as SyncHelper,oe as SyncUtil,ge as ThirdpartyRequest,fe as UserRequest,Ye as WordSyncManager}; diff --git a/src/assets/lib/kookit-extra.min.mjs b/src/assets/lib/kookit-extra.min.mjs index 9c8a7667..31f55b13 100644 --- a/src/assets/lib/kookit-extra.min.mjs +++ b/src/assets/lib/kookit-extra.min.mjs @@ -1 +1 @@ -import e from"axios";import t from"fs";import i from"path";import{promisify as o}from"util";import r from"stream";import{Client as s}from"basic-ftp";import{S3Client as n,ListObjectsV2Command as a,DeleteObjectCommand as d,PutObjectCommand as l,GetObjectCommand as c}from"@aws-sdk/client-s3";import{AuthType as u,createClient as h}from"webdav";import p from"ssh2-sftp-client";import f from"form-data";import{Storage as g}from"megajs";import y from"crypto";import m from"os";import{SSE as v}from"sse.js";import k from"electron-store";function b(e,t,i,o){return new(i||(i=Promise))((function(r,s){function n(e){try{d(o.next(e))}catch(e){s(e)}}function a(e){try{d(o.throw(e))}catch(e){s(e)}}function d(e){var t;e.done?r(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(n,a)}d((o=o.apply(e,t||[])).next())}))}const F=e=>"json"===e?"application/json":["jpg","jpeg","png","gif","bmp"].includes(e)?"image/"+e:"zip"===e?"application/zip":"epub"===e?"application/epub+zip":"txt"===e?"text/plain":"pdf"===e?"application/pdf":"mobi"===e?"application/x-mobipocket-ebook":"azw3"===e||"azw"===e?"application/vnd.amazon.ebook":"cbz"===e?"application/x-cbz":"cbr"===e?"application/x-cbr":"cbt"===e?"application/x-cbt":"cb7"===e?"application/x-cb7":"fb2"===e?"application/x-fictionbook+xml":"html"===e?"text/html":"css"===e?"text/css":"js"===e?"application/javascript":"xml"===e?"application/xml":"xhtml"===e?"application/xhtml+xml":"opf"===e?"application/oebps-package+xml":"ncx"===e?"application/x-dtbncx+xml":"mp3"===e?"audio/mpeg":"wav"===e?"audio/wav":"ogg"===e?"audio/ogg":"mp4"===e?"video/mp4":"webm"===e?"video/webm":"avi"===e?"video/x-msvideo":"wmv"===e?"video/x-ms-wmv":"flv"===e?"video/x-flv":"m3u8"===e?"application/x-mpegURL":"ts"===e?"video/MP2T":"3gp"===e?"video/3gpp":"3g2"===e?"video/3gpp2":"db"===e?"application/x-sqlite3":void 0,w={_chars:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",encode(e){if("string"!=typeof e)throw new Error("Input must be a string");let t="",i=0;const o=this._stringToUtf8Bytes(e),r=o.length;for(;i>2,d=(3&e)<<4|s>>4,l=(15&s)<<2|n>>6,c=63&n;t+=this._chars.charAt(a),t+=this._chars.charAt(d),t+=i-2>=r?"=":this._chars.charAt(l),t+=i-1>=r?"=":this._chars.charAt(c)}return t},decode(e){if("string"!=typeof e)throw new Error("Input must be a string");for(e=e.replace(/[^A-Za-z0-9+/]/g,"");e.length%4!=0;)e+="=";const t=[];let i=0;const o=e.length;for(;i>4,d=(15&r)<<4|s>>2,l=(3&s)<<6|n;t.push(a),-1!==s&&t.push(d),-1!==n&&t.push(l)}return this._utf8BytesToString(t)},_stringToUtf8Bytes(e){const t=[];for(let i=0;i>6),t.push(128|63&o);else if(55296==(64512&o)&&i+1>18),t.push(128|e>>12&63),t.push(128|e>>6&63),t.push(128|63&e)}else t.push(239,191,189),i--}else t.push(224|o>>12),t.push(128|o>>6&63),t.push(128|63&o)}return t},_utf8BytesToString(e){let t="",i=0;for(;i65535){const i=e-65536;t+=String.fromCharCode(55296|i>>10),t+=String.fromCharCode(56320|1023&i)}else t+=String.fromCharCode(e)}else t+="�"}else t+="�"}return t},encodeURL(e){return this.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")},decodeURL(e){for(e=e.replace(/-/g,"+").replace(/_/g,"/");e.length%4;)e+="=";return this.decode(e)}};class E{constructor(e){this.queue=[],this.runningTasks=0,this.totalTasks=0,this.completedTasks=0,this.hasFailedTasks=!1,this.downloadedSize=0,this.maxConcurrency=e}addTask(e){return b(this,void 0,void 0,(function*(){return this.totalTasks++,new Promise(((t,i)=>{if(this.hasFailedTasks)return void t(void 0);const o=()=>b(this,void 0,void 0,(function*(){if(this.hasFailedTasks)return this.completedTasks++,void t(void 0);try{this.runningTasks++;const i=yield e();return this.completedTasks++,t(i),i}catch(e){throw this.completedTasks++,i(e),e}finally{this.runningTasks--,this.runNext()}}));this.runningTasks0;){const e=this.queue.shift();e&&e()}else if(this.queue.length>0&&this.runningTasks=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=[],r=!0,s=null;for(;r;){let n;n=s?yield e.post("https://api.dropboxapi.com/2/files/list_folder/continue",{cursor:s},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}}):yield e.post("https://api.dropboxapi.com/2/files/list_folder",{path:"/"+t,limit:2e3},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});const a=n.data.entries||[];o=o.concat(a),r=n.data.has_more,s=n.data.cursor}return[...new Set(o.map((e=>({name:e.name,size:e.size||0,type:e[".tag"],modified:e.client_modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;yield e.post("https://api.dropboxapi.com/2/files/delete_v2",{path:"/"+t},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});return!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://www.dropbox.com/oauth2/authorize?response_type=code&token_access_type=offline&client_id=${x}&redirect_uri=${e}`}}const j=o(r.pipeline);class D extends Q{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token,n=t.createReadStream(i.join(this.storagePath,o));return yield e.post("https://content.dropboxapi.com/2/files/upload",n,{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/octet-stream","Dropbox-API-Arg":JSON.stringify({path:"/"+r,mode:"overwrite",autorename:!0,mute:!1})},maxContentLength:1/0,maxBodyLength:1/0}),!0}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token,n=t.createWriteStream(i.join(this.storagePath,r)),a=yield e({url:"https://content.dropboxapi.com/2/files/download",method:"GET",responseType:"stream",headers:{Authorization:`Bearer ${s}`,"Dropbox-API-Arg":JSON.stringify({path:"/"+o})},maxContentLength:1/0,maxBodyLength:1/0});let d=0;return a.data.on("data",(e=>{d+=e.length,this.taskQueue.setDownloadedSize(d)})),yield j(a.data,n),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class B{constructor(e){this.config=e,this.storagePath=e.storagePath,this.taskQueue=new E(1),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getClient(){return b(this,void 0,void 0,(function*(){try{if(this.client&&!1===this.client.closed)return this.client;let{url:e,username:t,password:i,dir:o,ssl:r,port:n}=this.config;const a=new s(0);a.ftp.verbose=!0;const d=a.access({host:e,port:parseInt(n),user:t,password:i,secure:"1"===r}),l=new Promise(((e,t)=>{setTimeout((()=>t(new Error("FTP connection timeout"))),5e3)}));return yield Promise.race([d,l]),this.client=a,a}catch(e){throw console.error("Error connecting to FTP server:",e),this.client=null,e}}))}uploadFile(e,t){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let{dir:o}=this.config;o=o&&"KoodoReader"===this.baseFolder?o:this.baseFolder;const r=yield this.getClient(),s=()=>b(this,void 0,void 0,(function*(){yield r.ensureDir(i.dirname(o+"/"+t)),yield r.cd("/"),yield r.uploadFrom(i.join(this.storagePath,e),o+"/"+t)}));try{return yield s(),!0}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let{dir:r}=this.config;r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder;const s=yield this.getClient(),n=t.createWriteStream(i.join(this.storagePath,o)),a=()=>b(this,void 0,void 0,(function*(){s.trackProgress((e=>{this.taskQueue.setDownloadedSize(e.bytes||0)})),yield s.downloadTo(n,r+"/"+e),s.trackProgress()}));try{return yield a(),!0}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.listFilesWithoutQueue(e)}))))))}))}listFilesWithoutQueue(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;const i=yield this.getClient(),o=()=>b(this,void 0,void 0,(function*(){return yield i.list(t+"/"+e)}));try{return(yield o()).map((e=>({name:e.name,size:e.size||0,type:e.isFile?"file":"folder",modified:e.modifiedAt?e.modifiedAt.toISOString():""})))}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;const i=yield this.getClient(),o=()=>b(this,void 0,void 0,(function*(){yield i.remove(t+"/"+e)}));try{return yield o(),!0}catch(e){return console.error(e),!1}}))}}class M{constructor(e){this.isExp=!1,this.baseUrl="https://graph.microsoft.com/v1.0/me/drive/special/approot",this.config=e,this.taskQueue=new E(3),this.isExp=this.config.isExp||!1,this.baseUrl=this.isExp?"https://graph.microsoft.com/v1.0/me/drive/root":"https://graph.microsoft.com/v1.0/me/drive/special/approot",void 0===this.config.baseFolder?this.baseFolder=this.isExp?"KoodoReader":"":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);let o,r=[];if(""===t)o=`${this.baseUrl}/children`;else{const e=encodeURIComponent(t);o=`${this.baseUrl}:/${e}:/children`}for(;o;){const t=yield e.get(o,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});if(t.status>=300)break;const s=t.data.value||[];r=r.concat(s),o=t.data["@odata.nextLink"]||""}return[...new Set(r.map((e=>({name:e.name,size:e.size||0,type:e.folder?"folder":"file",modified:e.lastModifiedDateTime}))))]}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);const o=yield e.delete(`${this.baseUrl}:/${t}`,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});return!(o.status>=300)||(console.error("Error deleting file:",o),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${I}&scope=${this.isExp?"files.readwrite.all":"files.readwrite.appfolder"} offline_access&response_type=code&redirect_uri=${e}`}}const U=209715200;class W extends M{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){var s;let n=null;try{const s=this.config.access_token;let a=this.baseFolder+"/"+r;for(;a.startsWith("/");)a=a.substring(1);const d=i.join(this.storagePath,o),l=yield this.getFileSize(d),c=a.split(".").pop(),u=(F(c||""),`${this.baseUrl}:/${a}:/createUploadSession`),h=(yield e.post(u,{item:{"@microsoft.graph.conflictBehavior":"replace"}},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}})).data.uploadUrl;n=yield t.promises.open(d,"r");let p=0,f=Buffer.alloc(U);for(;pthis.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token;let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const a=`${this.baseUrl}:/${n}:/content`;let d=(yield fetch(a,{headers:{Authorization:"Bearer "+s},redirect:"manual"})).headers.get("location");if(d){const o=yield e.get(d,{responseType:"stream"});let s=0;const n=t.createWriteStream(i.join(this.storagePath,r));return o.data.on("data",(e=>{s+=e.length,this.taskQueue.setDownloadedSize(s)})),yield new Promise(((e,t)=>{o.data.pipe(n),n.on("finish",(()=>{e()})),n.on("error",t)})),!0}return!1}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}class N{constructor(e){this.isExp=!1,this.folderIdCache=new Map,this.config=e,this.taskQueue=new E(3),this.isExp=this.config.isExp||!1,this.baseFolder="KoodoReader"}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getFileId(t,i){return b(this,void 0,void 0,(function*(){const o=this.config.access_token,r=`https://www.googleapis.com/drive/v3/files?q=name='${t}'+and+'${i}'+in+parents&fields=files(id,name)`;try{const t=yield e.get(r,{headers:{Authorization:"Bearer "+o}});if(0===t.data.files.length)return"";const i=t.data.files;return i.length>0?i[0].id:null}catch(e){return console.error("Error occurred during file list retrieval:",e),""}}))}checkFolder(t){return b(this,void 0,void 0,(function*(){t=this.baseFolder+"/"+t;const i=this.config.access_token;if(""===t)return"root";if(this.folderIdCache.has(t))return this.folderIdCache.get(t);const o=t.split("/").filter((e=>""!==e.trim()));let r="root",s="";for(const t of o){if(s=s?s+"/"+t:t,this.folderIdCache.has(s)){r=this.folderIdCache.get(s);continue}let o=yield this.getFolderId(t,r);if(!o){const s={name:t,mimeType:"application/vnd.google-apps.folder",parents:[r]};try{o=(yield e.post("https://www.googleapis.com/drive/v3/files",s,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.id}catch(e){throw console.error(`Error occurred during folder creation for ${t}:`,e),e}}this.folderIdCache.set(s,o),r=o}return r}))}getFolderId(t,i){return b(this,void 0,void 0,(function*(){const o=this.config.access_token,r=`https://www.googleapis.com/drive/v3/files?q=name='${t=encodeURIComponent(t)}'+and+mimeType='application/vnd.google-apps.folder'+and+'${i}'+in+parents&fields=files(id,name)`;try{const t=(yield e.get(r,{headers:{Authorization:`Bearer ${o}`}})).data.files;return t.length>0?t[0].id:null}catch(e){throw console.error("Error occurred during fetching folder ID:",e),e}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=yield this.checkFolder(t),r=[],s="",n=!0;for(;n;){let t=`https://www.googleapis.com/drive/v3/files?q='${o}'+in+parents&fields=nextPageToken,files(id,name,size,mimeType)&pageSize=1000`;s&&(t+=`&pageToken=${s}`);const a=yield e.get(t,{headers:{Authorization:`Bearer ${i}`}}),d=a.data.files||[];r=r.concat(d),s=a.data.nextPageToken,n=!!s}return[...new Set(r.map((e=>({name:e.name,size:e.size||0,type:"application/vnd.google-apps.folder"===e.mimeType?"folder":"file",modified:e.modifiedTime}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQue(e)}))))))}))}deleteFileWithoutQue(t){return b(this,void 0,void 0,(function*(){const i=t.split("/").pop()||"",o=t.split("/").slice(0,-1).join("/"),r=yield this.checkFolder(o),s=this.config.access_token,n=yield this.getFileId(i,r);if(""===n)return console.error("File not found:",i),!0;try{const t=yield e.delete(`https://www.googleapis.com/drive/v3/files/${n}`,{headers:{Authorization:`Bearer ${s}`}});return console.error("File deleted:",t),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${e}&prompt=consent&response_type=code&client_id=${$}&scope=https://www.googleapis.com/auth/${this.isExp?"drive":"drive.file"}&access_type=offline`}}class K extends N{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token;let n=o.split("/").pop(),a=r.split(".").pop(),d=F(a||""),l=r.split("/").slice(0,-1).join("/"),c=yield this.checkFolder(l),u=yield this.getFileId(n||"",c);const h={mimeType:d,name:n,parents:[c]},p=u?`https://www.googleapis.com/upload/drive/v3/files/${u}?uploadType=resumable`:"https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable",f=(yield e({method:u?"PATCH":"POST",url:p,data:u?null:JSON.stringify(h),headers:{Authorization:"Bearer "+s,"Content-Type":"application/json; charset=UTF-8"},maxContentLength:1/0,maxBodyLength:1/0})).headers.location;let g=yield this.getFileSize(i.join(this.storagePath,o));const y=t.createReadStream(i.join(this.storagePath,o));yield e.put(f,y,{headers:{Authorization:"Bearer "+s,"Content-Type":"application/zip","Content-Range":`bytes 0-${g-1}/${g}`},maxContentLength:1/0,maxBodyLength:1/0});return!0}catch(e){return console.error("Error occurred during upload:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token;let n=o.split("/").pop(),a=o.split("/").slice(0,-1).join("/"),d=yield this.checkFolder(a),l=yield this.getFileId(n||"",d);if(!l)return console.error("File not found"),!0;const c=`https://www.googleapis.com/drive/v3/files/${l}?alt=media`;return new Promise((o=>{const n=t.createWriteStream(i.join(this.storagePath,r));e({url:c,method:"GET",responseType:"stream",headers:{Authorization:"Bearer "+s},maxContentLength:1/0,maxBodyLength:1/0}).then((e=>{let t=0;e.data.on("data",(e=>{t+=e.length,this.taskQueue.setDownloadedSize(t)})),e.data.pipe(n),n.on("finish",(()=>{o(!0)})),n.on("error",(()=>{o(!1)}))})).catch((e=>{console.error("Error downloading file:",e),o(!1)}))}))}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}class H{constructor(e){this.config=e,this.taskQueue=new E(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}shouldUsePathStyle(){try{if(this.config.forcePathStyle&&"no"!==this.config.forcePathStyle)return!0;let e=this.config.endpoint;const t=new URL(e),i=t.hostname,o=/^(\d{1,3}\.){3}\d{1,3}$/.test(i),r=""!==t.port;return!o&&r}catch(e){return!0}}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:o,accessKeyId:r,secretAccessKey:s,dir:d}=this.config;d=d&&"KoodoReader"===this.baseFolder?d:this.baseFolder;let l=d+"/"+e;for(;l.startsWith("/");)l=l.substring(1);""===l||l.endsWith("/")||(l+="/");const c=new n({endpoint:t,region:i,credentials:{accessKeyId:r,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});try{let e,t=[],i=[],r=!0;for(;r;){const s=yield c.send(new a({Bucket:o,Prefix:l,Delimiter:"/",ContinuationToken:e}));s.Contents&&(t=t.concat(s.Contents)),s.CommonPrefixes&&(i=i.concat(s.CommonPrefixes)),e=s.NextContinuationToken,r=!!e}let s=[];return t.forEach((e=>{if(!e.Key.endsWith("/")){const t=e.Key.substring(l.length);t.includes("/")||s.push({name:t,size:e.Size||0,type:"file",modified:e.LastModified?e.LastModified.toISOString():""})}})),i.forEach((e=>{const t=e.Prefix.substring(l.length).replace(/\/$/,"");t&&s.push({name:t,size:0,type:"folder",modified:""})})),s}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:o,accessKeyId:r,secretAccessKey:s,dir:a}=this.config;a=a&&"KoodoReader"===this.baseFolder?a:this.baseFolder;const l=new n({endpoint:t,region:i,credentials:{accessKeyId:r,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});let c=a+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{return yield l.send(new d({Bucket:o,Key:c})),!0}catch(e){return console.error(e),!1}}))}}class q extends H{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){let{endpoint:r,region:s,bucketName:a,accessKeyId:d,secretAccessKey:c,dir:u}=this.config;const h=new n({endpoint:r,region:s,credentials:{accessKeyId:d,secretAccessKey:c},forcePathStyle:this.shouldUsePathStyle()});u=u&&"KoodoReader"===this.baseFolder?u:this.baseFolder;let p=u+"/"+o;for(;p.startsWith("/");)p=p.substring(1);try{let o=yield h.send(new l({Bucket:a,Key:p,Body:t.createReadStream(i.join(this.storagePath,e))}));return 200===o.$metadata.httpStatusCode||(console.error("Error uploading file:",o),!1)}catch(e){return console.error("Error: ",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let{endpoint:r,region:s,bucketName:a,accessKeyId:d,secretAccessKey:l,dir:u}=this.config;u=u&&"KoodoReader"===this.baseFolder?u:this.baseFolder;const h=(e,t,i,o)=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){const s=yield e.send(new c({Bucket:t,Key:i}));let n=0;s.Body?(s.Body.on("data",(e=>{n+=e.length,this.taskQueue.setDownloadedSize(n)})),s.Body.pipe(o),o.on("finish",(e=>{e&&r(!1),r(!0)}))):r(!1)})))),p=()=>new Promise(((c,p)=>{const f=new n({region:s,endpoint:r,credentials:{accessKeyId:d,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});let g=t.createWriteStream(i.join(this.storagePath,o)),y=u+"/"+e;for(;y.startsWith("/");)y=y.substring(1);h(f,a,y,g).then((e=>{c(!0)})).catch((e=>{console.error(e),c(!1)}))}));try{return yield p()}catch(e){return console.error(e),!1}}))))))}))}}class J{constructor(e){let{username:t,password:i,url:o,dir:r,AuthType:s,createClient:n}=e;void 0===e.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=e.baseFolder,r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder,this.username=t,this.password=i,this.url=o,this.dir=r,this.taskQueue=new E(5),this.AuthType=s,this.createClient=n}getClient(){return b(this,void 0,void 0,(function*(){return this.webdavClient||(this.url=yield this.handleUrlRedirection(this.url),this.webdavClient=this.createClient(this.url,{authType:this.AuthType.Password,username:this.username,password:this.password})),this.webdavClient}))}handleUrlRedirection(t){return b(this,void 0,void 0,(function*(){try{const i=yield e.head(t,{maxRedirects:0,validateStatus:()=>!0,timeout:5e3});return i.request&&i.request.responseURL&&i.request.responseURL!==t?i.request.responseURL:i.status>=300&&i.status<400&&i.headers.location?i.headers.location:t}catch(e){return console.info("Error handling URL redirection:",e),t}}))}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){const t=yield this.getClient();try{const i=t.getDirectoryContents(this.dir+"/"+e),o=new Promise(((e,t)=>{setTimeout((()=>t(new Error("WebDAV list directory timeout"))),5e3)}));return(yield Promise.race([i,o])).filter((t=>"."!==t.filename&&".."!==t.filename&&t.filename!==e)).map((e=>({name:e.basename,size:e.size||0,type:"directory"===e.type?"folder":"file",modified:e.lastmod})))}catch(i){return i.response&&404===i.response.status&&(yield t.createDirectory(this.dir+"/"+e)),console.error("Error listing files:",i),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){const t=yield this.getClient();try{return yield t.deleteFile(this.dir+"/"+e),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(e){return b(this,void 0,void 0,(function*(){let t=yield this.getClient();try{const i=e.replace(/^\/+|\/+$/g,"").split("/").filter((e=>e.length>0));let o="";for(const e of i)o=o?`${o}/${e}`:e,(yield t.exists(`/${o}`))||(yield t.createDirectory(`/${o}`));return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}}class V extends J{constructor(e){super(Object.assign(Object.assign({},e),{AuthType:u,createClient:h})),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let s=yield this.getClient();const n=s.exists(i.dirname(this.dir+"/"+r)),a=new Promise(((e,t)=>{setTimeout((()=>t(new Error("WebDAV exists check timeout"))),5e3)}));!1===(yield Promise.race([n,a]))&&(yield this.ensureDirectoryExists(i.dirname(this.dir+"/"+r)));let d=t.readFileSync(i.join(this.storagePath,o)),l=i.extname(o).substring(1),c=F(l),u=s.createWriteStream(this.dir+"/"+r,{headers:{"content-type":c,"content-length":d.length}});return t.createReadStream(i.join(this.storagePath,o)).pipe(u),new Promise(((t,i)=>{u.on("finish",(()=>{t(!0)})),u.on("error",(i=>b(this,void 0,void 0,(function*(){console.error("Error occurred during file upload:",i);try{let i=s.getFileUploadLink(this.dir+"/"+r);const o=new URL(i);o.search="",i=o.toString();const n=Buffer.from(this.username+":"+this.password,"binary").toString("base64");yield e.put(i,d,{headers:{Authorization:"Basic "+n,"Content-Type":c,"Content-Length":d.length},maxContentLength:1/0,maxBodyLength:1/0});t(!0)}catch(e){console.error("Error occurred during file upload:",e),t(!1)}}))))}))}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){if(this.taskQueue.setDownloadedSize(0),-1===e.indexOf("."))return new ArrayBuffer(0);try{let r=yield this.getClient();if(!1===(yield r.exists(this.dir+"/"+e)))return!0;let s=0,n=t.createWriteStream(i.join(this.storagePath,o)),a=r.createReadStream(this.dir+"/"+e);return a.on("data",(e=>{s+=e.length,this.taskQueue.setDownloadedSize(s)})),a.pipe(n),new Promise(((e,t)=>{n.on("finish",(()=>{e(!0)})),n.on("error",(t=>{e(!1)}))}))}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class X{constructor(e){this.folderExistsCache=new Set,this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){var i,o;return b(this,void 0,void 0,(function*(){try{const r=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);let s=[],n=0;const a=1e3;let d=!0;for(;d;){const l=yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${r}`,"Content-Type":"application/json"},params:{path:t?`/${t}`:"/",limit:a,offset:n,fields:"_embedded.items.name,_embedded.items.size,_embedded.items.type,_embedded.items.modified,_embedded.total"}}),c=(null===(i=l.data._embedded)||void 0===i?void 0:i.items)||[];s=s.concat(c);const u=(null===(o=l.data._embedded)||void 0===o?void 0:o.total)||0;n+=c.length,d=n({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);const o=yield e.delete("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:t?`/${t}`:"/",permanently:!1}});return 202===o.status||204===o.status}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(t){var i,o;return b(this,void 0,void 0,(function*(){try{const r=this.config.access_token,s=t.split("/").filter((e=>e.length>0));let n="";for(const t of s)if(n+="/"+t,!this.folderExistsCache.has(n))try{yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${r}`,"Content-Type":"application/json"},params:{path:n}}),this.folderExistsCache.add(n)}catch(t){if(404!==(null===(i=t.response)||void 0===i?void 0:i.status))return console.error("Error checking directory:",t),!1;try{yield e.put(`https://cloud-api.yandex.net/v1/disk/resources?path=${encodeURIComponent(n)}`,null,{headers:{Authorization:`OAuth ${r}`}}),this.folderExistsCache.add(n)}catch(e){if(409!==(null===(o=e.response)||void 0===o?void 0:o.status))return console.error("Error creating directory:",e),!1;this.folderExistsCache.add(n)}}return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}getAuthUrl(e){return`https://oauth.yandex.com/authorize?response_type=code&client_id=${R}&redirect_uri=${e}&force_confirm=true`}}const Y=o(r.pipeline);class G extends X{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token;let n=this.baseFolder+"/"+r;for(;n.startsWith("/");)n=n.substring(1);const a=n.substring(0,n.lastIndexOf("/"));if(a){if(!(yield this.ensureDirectoryExists(a)))return console.error("Failed to create directory:",a),!1}const d=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/upload",{headers:{Authorization:`OAuth ${s}`,"Content-Type":"application/json"},params:{path:`/${n}`,overwrite:!0}});if(200!==d.status)return console.error("Error getting upload URL:",d),!1;const l=d.data.href,c=t.createReadStream(i.join(this.storagePath,o));return yield e.put(l,c,{headers:{"Content-Type":"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0}),!0}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let s=this.baseFolder+"/"+o;for(;s.startsWith("/");)s=s.substring(1);try{const o=this.config.access_token,n=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/download",{headers:{Authorization:`OAuth ${o}`,"Content-Type":"application/json"},params:{path:`/${s}`}});if(200!==n.status)return console.error("Error getting download URL:",n),!1;const a=n.data.href,d=t.createWriteStream(i.join(this.storagePath,r)),l=yield e({url:a,method:"GET",responseType:"stream",maxContentLength:1/0,maxBodyLength:1/0});let c=0;return l.data.on("data",(e=>{c+=e.length,this.taskQueue.setDownloadedSize(c)})),yield Y(l.data,d),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class Z{constructor(e){this.config=e,this.storagePath=e.storagePath,this.taskQueue=new E(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getClient(){return b(this,void 0,void 0,(function*(){try{if(this.client)return this.client;let{url:e,username:t,password:i,dir:o,port:r}=this.config;const s=new p,n=s.connect({host:e||"",port:r||22,username:t||"",password:i||""}),a=new Promise(((e,t)=>{setTimeout((()=>t(new Error("SFTP connection timeout"))),5e3)}));return yield Promise.race([n,a]),this.client=s,s}catch(e){throw console.error("Error connecting to SFTP server:",e),this.client=null,e}}))}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let{dir:r}=this.config;r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder;let s=yield this.getClient();const n=()=>new Promise(((n,a)=>b(this,void 0,void 0,(function*(){let a=t.createReadStream(i.join(this.storagePath,e)),d="/"+r+"/"+o,l="/"+r+"/"+i.dirname(o);(yield s.exists(l))||(yield s.mkdir(l,!0)),s.put(a,d).then((()=>{n(!0)})).catch((e=>{console.error(e.message),n(!1)}))}))));try{return yield n()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let{dir:r}=this.config;r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder;let s=yield this.getClient();const n=()=>new Promise(((n,a)=>b(this,void 0,void 0,(function*(){let a="/"+r+"/"+e,d=i.join(this.storagePath,o),l=t.createWriteStream(d);s.get(a,l).then((()=>{this.taskQueue.setDownloadedSize(l.bytesWritten||0),n(!0)})).catch((e=>{console.error(e.message),n(!1)}))}))));try{return yield n()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;let i=yield this.getClient();const o=()=>new Promise(((o,r)=>b(this,void 0,void 0,(function*(){let r="/"+t+"/"+e;(yield i.exists(r))||(yield i.mkdir(r,!0),o([])),i.list(r).then((e=>{o(e.map((e=>({name:e.name,size:e.size||0,type:"d"===e.type?"folder":"file",modified:e.modifyTime}))))})).catch((e=>b(this,void 0,void 0,(function*(){console.error(e.message,"list file error"),o([])}))))}))));try{return yield o()}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;let i=yield this.getClient();try{return yield new Promise(((o,r)=>{let s="/"+t+"/"+e;i.delete(s).then((()=>{o(!0)})).catch((e=>{console.error(e.message),o(!1)}))}))}catch(e){return console.error(e),!1}}))}}class ee{downloadFile(e,t){return b(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}uploadFile(e,t){return b(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return new Promise((e=>{e([])}))}))}getAuthUrl(){return""}}class te{constructor(e){this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getFolderIdByPath(t){return b(this,void 0,void 0,(function*(){if(""==t)return"0";const i=this.config.access_token,o=t.split("/");let r="0";for(const t of o){const o=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=folder&limit=1000`;try{const s=(yield e.get(o,{headers:{Authorization:`Bearer ${i}`}})).data.entries.find((e=>e.name===t&&"folder"===e.type));if(s)r=s.id;else{const o={name:t,parent:{id:r},type:"folder"};r=(yield e.post("https://api.box.com/2.0/folders",o,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.id}}catch(e){return console.error("Error occurred during folder creation:",e),""}}return r}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=this.baseFolder+"/"+t;for(;o.startsWith("/");)o=o.substring(1);let r=yield this.getFolderIdByPath(o),s=[],n=0,a=!0;const d=1e3;for(;a;){const t=yield e.get(`https://api.box.com/2.0/folders/${r}/items`,{params:{limit:d,offset:n},headers:{Authorization:`Bearer ${i}`}}),o=t.data.entries||[];s=s.concat(o),n+=o.length,a=o.length===d&&t.data.total_count>n}return[...new Set(s.map((e=>({name:e.name,size:e.size||0,type:e.type,modified:e.content_modified_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=t.substring(0,t.lastIndexOf("/")),r=t.substring(t.lastIndexOf("/")+1);let s=this.baseFolder+"/"+o;for(;s.startsWith("/");)s=s.substring(1);const n=yield this.getFolderIdByPath(s);if(!n)return!0;const a=`https://api.box.com/2.0/folders/${n}/items?fields=id,name&type=file&limit=1000`,d=(yield e.get(a,{headers:{Authorization:`Bearer ${i}`}})).data.entries.find((e=>e.name===r&&"file"===e.type));return!d||(yield e.delete(`https://api.box.com/2.0/files/${d.id}`,{headers:{Authorization:`Bearer ${i}`}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://account.box.com/api/oauth2/authorize?${new URLSearchParams({response_type:"code",client_id:_,redirect_uri:e,grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}).toString()}`}}class ie extends te{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token,n=r.substring(0,r.lastIndexOf("/")),a=r.substring(r.lastIndexOf("/")+1);let d=this.baseFolder+"/"+n;for(;d.startsWith("/");)d=d.substring(1);const l=yield this.getFolderIdByPath(d);if(!l)throw new Error("Folder not found");const c=yield this.listFiles(n);c.find((e=>e===a))&&(yield this.deleteFileWithoutQueue(n+"/"+a));const u=new f,h=JSON.stringify({name:a,parent:{id:l}});u.append("attributes",h),u.append("file",t.createReadStream(i.join(this.storagePath,o)));const p=yield e.post("https://upload.box.com/api/2.0/files/content",u,{headers:Object.assign({Authorization:`Bearer ${s}`},u.getHeaders()),maxContentLength:1/0,maxBodyLength:1/0});return!(p.status>=300)||(console.error("Error occurred during file upload:",p),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token,n=o.substring(0,o.lastIndexOf("/")),a=o.substring(o.lastIndexOf("/")+1);let d=this.baseFolder+"/"+n;for(;d.startsWith("/");)d=d.substring(1);const l=yield this.getFolderIdByPath(d);if(!l)return console.error("Folder not found"),!0;const c=`https://api.box.com/2.0/folders/${l}/items?fields=id,name&type=file&limit=1000`,u=(yield e.get(c,{headers:{Authorization:`Bearer ${s}`}})).data.entries.find((e=>e.name===a&&"file"===e.type));if(!u)return console.error("File not found:",a),!0;const h=yield e({url:`https://api.box.com/2.0/files/${u.id}/content`,method:"get",responseType:"stream",headers:{Authorization:`Bearer ${s}`}});return yield new Promise(((e,o)=>{let s=0;const n=t.createWriteStream(i.join(this.storagePath,r));h.data.on("data",(e=>{s+=e.length,this.taskQueue.setDownloadedSize(s)})),h.data.pipe(n),n.on("finish",e),n.on("error",o)})),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class oe{constructor(e){this.folderCreationLocks=new Map,this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=2){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getStorage(){return b(this,void 0,void 0,(function*(){if(this.storage)return this.storage;let{email:e,password:t}=this.config;return this.storage=yield new g({email:e,password:t,userAgent:"KoodoReader/1.0"}).ready,this.storage}))}getRoot(){return b(this,void 0,void 0,(function*(){if(this.root)return this.root;const e=(yield this.getStorage()).root;if(""===this.baseFolder)return this.root=e,this.root;let t=e.children.find((e=>e.name===this.baseFolder&&e.directory));return t||(t=yield e.mkdir(this.baseFolder)),this.root=t,this.root}))}createFolder(e,t){return b(this,void 0,void 0,(function*(){const i=`${e.nodeId}_${t}`;if(this.folderCreationLocks.has(i))return yield this.folderCreationLocks.get(i);const o=(()=>b(this,void 0,void 0,(function*(){try{let i=e.children.find((e=>e.name===t&&e.directory));return i||(i=yield e.mkdir(t),i)}finally{this.folderCreationLocks.delete(i)}})))();return this.folderCreationLocks.set(i,o),yield o}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){try{let t=yield this.getRoot();if(e){const i=e.split("/").filter((e=>e));for(const e of i){const i=t.children.find((t=>t.name===e&&t.directory));if(!i)return[];t=i}}return t.children.map((e=>({name:e.name,size:e.size||0,type:e.directory?"folder":"file",modified:e.timestamp?new Date(1e3*e.timestamp).toISOString():""})))}catch(e){return console.error("Error listing MEGA files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return b(this,void 0,void 0,(function*(){try{let t=yield this.getRoot();const i=e.split("/"),o=i.pop();for(const e of i){if(!e)continue;const i=t.children.find((t=>t.name===e&&t.directory));if(!i)return!0;t=i}const r=t.children.find((e=>e.name===o&&!e.directory));return!r||(yield r.delete(),!0)}catch(e){return console.error("Error deleting MEGA file:",e),!1}}))}}class re extends oe{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let r=yield this.getRoot();const s=o.split("/"),n=s.pop()||"";for(const e of s){if(!e)continue;let t=r.children.find((t=>t.name===e&&t.directory));t||(t=yield this.createFolder(r,e)),r=t}const a=r.children.find((e=>e.name===n&&!e.directory));a&&(yield a.delete());const d=t.createReadStream(i.join(this.storagePath,e)),l=t.statSync(i.join(this.storagePath,e)).size;return yield r.upload({name:n,size:l},d).complete,!0}catch(e){return console.error("Error occurred during MEGA file upload:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let r=yield this.getRoot();const s=e.split("/"),n=s.pop()||"";for(const e of s){if(!e)continue;const t=r.children.find((t=>t.name===e&&t.directory));if(!t)return!0;r=t}const a=r.children.find((e=>e.name===n&&!e.directory));if(!a)return!0;const d=t.createWriteStream(i.join(this.storagePath,o));let l=0;return new Promise((e=>{const t=a.download();t.on("data",(e=>{l+=e.length,this.taskQueue.setDownloadedSize(l)})),t.pipe(d),d.on("finish",(()=>e(!0))),d.on("error",(t=>{console.error("Error writing file:",t),e(!1)}))}))}catch(e){return console.error("Error occurred during MEGA file download:",e),!1}}))))))}))}}class se{constructor(e){this.config=e,this.driveId="",this.taskQueue=new E(1),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getDriveId(){return b(this,void 0,void 0,(function*(){if(this.driveId)return this.driveId;const t=this.config.access_token,i=yield e.post("https://openapi.alipan.com/adrive/v1.0/user/getDriveInfo",{},{headers:{Authorization:`Bearer ${t}`}});return this.driveId=i.data.default_drive_id,this.driveId}))}getFolderIdByPath(t){return b(this,void 0,void 0,(function*(){const i=this.config.access_token,o=yield this.getDriveId();try{try{const r=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:t},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});if(r.data)return r.data.file_id}catch(r){const s=t.split("/").filter((e=>e));let n="",a="root";for(const t of s){n+="/"+t;try{a=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:n},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.file_id}catch(r){a=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:o,parent_file_id:a,name:t,type:"folder",check_name_mode:"refuse"},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.file_id}}return a}}catch(e){return console.error("Error getting/creating folder by path:",e),""}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=yield this.getDriveId(),r=yield this.getFolderIdByPath(this.baseFolder+"/"+t);let s=[],n="",a=!0;for(;a;){const t=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/list",{drive_id:o,parent_file_id:r,marker:n||void 0},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}}),d=t.data.items.filter((e=>!e.punish_flag||2!==e.punish_flag))||[];s=s.concat(d),n=t.data.next_marker,a=!!n}return[...new Set(s.map((e=>({name:e.name,size:e.size,type:e.type,modified:e.updated_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=yield this.getDriveId(),r=yield this.getFolderIdByPath(this.baseFolder+"/"+t);return!r||(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/delete",{drive_id:o,file_id:r},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}checkExists(t){var i;return b(this,void 0,void 0,(function*(){try{const o=this.config.access_token,r=yield this.getDriveId(),s=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:r,file_path:t},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}});(null===(i=s.data)||void 0===i?void 0:i.file_id)&&(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/recyclebin/trash",{drive_id:r,file_id:s.data.file_id},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}))}catch(e){}}))}getAuthUrl(e){return`https://openapi.alipan.com/oauth/authorize?${new URLSearchParams({response_type:"code",client_id:L,redirect_uri:e,grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}).toString()}`}}class ne extends se{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token,n=yield this.getDriveId(),a=r.substring(0,r.lastIndexOf("/")),d=r.substring(r.lastIndexOf("/")+1);yield this.deleteFileWithoutQueue(r);const l=yield this.getFolderIdByPath(this.baseFolder+"/"+a),c=i.join(this.storagePath,o),u=yield t.promises.readFile(c),h=u.length,p=y.createHash("sha1").update(u).digest("hex"),f=y.createHash("md5").update(s).digest("hex"),g=Number(BigInt("0x"+f.slice(0,16))%BigInt(h||1)),m=u.slice(g,Math.min(g+8,h)).toString("base64"),v=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:n,parent_file_id:l,name:d,type:"file",check_name_mode:"ignore",size:h,content_hash:p,content_hash_name:"sha1",proof_code:m,proof_version:"v1",part_info_list:[{part_number:1}]},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}),{file_id:k,upload_id:b,rapid_upload:F,part_info_list:w}=v.data;return F?(console.info("阿里云盘秒传成功"),!0):(yield fetch(w[0].upload_url,{method:"PUT",body:u,headers:{"Content-Length":h.toString()}}),yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/complete",{drive_id:n,file_id:k,upload_id:b},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token,n=yield this.getDriveId(),a=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:n,file_path:this.baseFolder+"/"+o},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}})).data.file_id,d=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/getDownloadUrl",{drive_id:n,file_id:a},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}),l=yield e({url:d.data.url,method:"get",responseType:"stream"});let c=0;const u=t.createWriteStream(i.join(this.storagePath,r+".temp"));return l.data.on("data",(e=>{c+=e.length,this.taskQueue.setDownloadedSize(c)})),l.data.pipe(u),new Promise((e=>{u.on("finish",(()=>{t.renameSync(i.join(this.storagePath,r+".temp"),i.join(this.storagePath,r)),e(!0)})),u.on("error",(t=>{console.error("Error occurred during file download:",t),e(!1)}))}))}catch(e){return console.error("Error downloading file:",e),!1}}))))))}))}}class ae{constructor(e){this.baseUrl="https://api.pcloud.com",this.config=e,this.taskQueue=new E(3),this.baseUrl="2"===e.region?"https://eapi.pcloud.com":"https://api.pcloud.com"}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}checkFolderExists(t,i){return b(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:i,path:`/${t}`}})).data.result}catch(e){return console.error("Error checking folder:",e),!1}}))}createFolder(t,i){return b(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/createfolderifnotexists`,{params:{access_token:i,path:`/${t}`}})).data.result}catch(e){return console.error("Error creating folder:",e),!1}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:i,path:"/"+t,recursive:0}});return 0!==o.data.result?[]:o.data.metadata.contents.map((e=>({name:e.name,size:e.size||0,type:e.isfolder?"folder":"file",modified:e.modified})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/deletefile`,{params:{access_token:i,path:"/"+t}});return 0===o.data.result||(console.error("Error deleting file:",o.data),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://my.pcloud.com/oauth2/authorize?client_id=${C}&response_type=code&redirect_uri=${e}`}}class de extends ae{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.refresh_token,n=r.split("/").slice(0,-1).join("/");if(!(yield this.checkFolderExists(n,s))){if(!(yield this.createFolder(n,s)))return!1}const a=i.join(this.storagePath,o),d=t.createReadStream(a),l=t.statSync(a),c=i.basename(o),u=yield e({method:"put",url:`${this.baseUrl}/uploadfile`,params:{access_token:s,path:`/${n}`,renew:1,filename:c},data:d,headers:{"Content-Length":l.size,"Content-Type":"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0});return 0===u.data.result||(console.error("Error uploading file:",u.data),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.refresh_token,n=yield e.get(`${this.baseUrl}/getfilelink`,{params:{access_token:s,path:`/${o}`}});if(0!==n.data.result)return console.error("Error getting file link:",n.data),!1;const a=i.join(this.storagePath,r),d=t.createWriteStream(a),l=`https://${n.data.hosts[0]}${n.data.path}`,c=yield e({method:"get",url:l,responseType:"stream",maxContentLength:1/0,maxBodyLength:1/0});return new Promise((e=>{let t=0;c.data.on("data",(e=>{t+=e.length,this.taskQueue.setDownloadedSize(t)})),c.data.pipe(d),d.on("finish",(()=>{e(!0)})),d.on("error",(t=>{console.error("Error writing file:",t),e(!1)}))}))}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class le{constructor(e){this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=this.baseFolder;t&&""!==t.trim()&&(o=o+"/"+t),o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));let r=[],s=0;const n=1e3;for(;;){const t=yield e.get("https://pan.baidu.com/rest/2.0/xpan/file",{params:{method:"list",access_token:i,dir:"/"+o,start:s,limit:n,order:"name",desc:0,web:1,folder:0},headers:{"User-Agent":"pan.baidu.com"}});if(t.status>=300||0!==t.data.errno){console.error("百度网盘API错误:",t.data);break}const a=t.data.list||[];if(0===a.length)break;if(r=r.concat(a),a.length({name:e.server_filename,size:e.size||0,type:e.isdir?"folder":"file",modified:new Date(1e3*e.server_mtime).toISOString(),path:e.path,fs_id:e.fs_id})))}catch(e){return console.error("获取百度网盘文件列表时发生错误:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=this.baseFolder+"/"+t;o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));const r=new URLSearchParams({async:"0",filelist:JSON.stringify(["/"+o])}),s=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=filemanager&access_token=${i}&opera=delete`,r.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==s.data.errno)return console.error("百度网盘删除文件API错误:",s.data),-9===s.data.errno?console.error("文件不存在"):111===s.data.errno?console.error("有其他异步任务正在执行"):-7===s.data.errno&&console.error("文件名非法"),!1;const n=s.data.info||[];for(const e of n)if(0!==e.errno)return console.error(`文件删除失败: ${e.path}, 错误码: ${e.errno}`),!1;return!0}catch(e){return console.error("删除文件时发生错误:",e),!1}}))}getAuthUrl(e){return`https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=${P}&redirect_uri=${e}&scope=basic,netdisk&device_id=119827642&display=page&qrcode=1`}}const ce=4194304;class ue extends le{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){var s;let n=null;try{const s=this.config.access_token;let a=this.baseFolder+"/"+r;a=a.replace(/\/+/g,"/"),a.startsWith("/")&&(a=a.substring(1));const d=i.join(this.storagePath,o),l=yield this.getFileSize(d),{contentMd5:c,sliceMd5:u,blockList:h}=yield this.calculateFileMd5(d,l),p=new URLSearchParams({path:"/"+a,size:l.toString(),isdir:"0",autoinit:"1",rtype:"3",block_list:JSON.stringify(h),"content-md5":c,"slice-md5":u,local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),g=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=${s}`,p.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==g.data.errno)return console.error("预上传失败:",g.data),-7===g.data.errno?console.error("文件或目录名错误或无权访问"):-10===g.data.errno&&console.error("容量不足"),!1;const y=g.data.uploadid,m=g.data.block_list||[];if(0===m.length)return!0;const v=yield this.getUploadDomain(s,"/"+a,y);if(!v)return console.error("获取上传域名失败"),!1;n=yield t.promises.open(d,"r");for(const t of m){const i=t*ce,o=Math.min(ce,l-i),r=Buffer.alloc(o),{bytesRead:d}=yield n.read(r,0,o,i);if(0===d)break;const c=r.slice(0,d),u=h[t],p=new f;p.append("file",c,{filename:`chunk_${t}`,contentType:"application/octet-stream",knownLength:c.length});const g=`${v}/rest/2.0/pcs/superfile2?method=upload&access_token=${s}&type=tmpfile&path=${encodeURIComponent("/"+a)}&uploadid=${y}&partseq=${t}`,m=yield e.post(g,p,{headers:Object.assign(Object.assign({"User-Agent":"pan.baidu.com"},p.getHeaders()),{"Content-Length":p.getLengthSync().toString()}),maxContentLength:1/0,maxBodyLength:1/0,timeout:0});if(m.status>=300)throw 31024===m.data.errno?console.error("没有申请上传权限"):31299===m.data.errno?console.error("第一个分片的大小小于4MB"):31364===m.data.errno?console.error("超出分片大小限制"):31363===m.data.errno&&console.error("分片缺失"),new Error(`分片上传失败: ${JSON.stringify(m.data)}`);const k=m.data.md5;k&&k!==u&&console.warn(`分片 ${t} MD5不匹配: 期望 ${u}, 实际 ${k}`)}const k=new URLSearchParams({path:"/"+a,size:l.toString(),isdir:"0",block_list:JSON.stringify(h),uploadid:y,rtype:"3",local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),b=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${s}`,k.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});return 0===b.data.errno||(console.error("创建文件失败:",b.data),-7===b.data.errno?console.error("文件或目录名错误或无权访问"):-8===b.data.errno?console.error("文件或目录已存在"):-10===b.data.errno?console.error("云端容量已满"):10===b.data.errno?console.error("创建文件失败,一般是分片问题"):31190===b.data.errno?console.error("文件不存在,一般是分片上传阶段有问题"):31355===b.data.errno?console.error("参数异常,一般是uploadid参数传的有问题"):31365===b.data.errno&&console.error("文件总大小超限"),!1)}catch(e){return console.error("文件上传过程中发生错误:",(null===(s=e.response)||void 0===s?void 0:s.data)||e.message||e),!1}finally{n&&(yield n.close())}}))))))}))}getUploadDomain(t,i,o){return b(this,void 0,void 0,(function*(){try{const r=yield e.get("https://d.pcs.baidu.com/rest/2.0/pcs/file",{params:{method:"locateupload",appid:"250528",access_token:t,path:i,uploadid:o,upload_version:"2.0"},headers:{"User-Agent":"pan.baidu.com"}});if(0!==r.data.error_code)return console.error("获取上传域名失败:",r.data),null;const s=r.data.servers||[],n=s.find((e=>e.server.startsWith("https://")));return n?n.server:s.length>0?s[0].server:(console.error("没有可用的上传服务器"),null)}catch(e){return console.error("获取上传域名时出错:",e),null}}))}calculateFileMd5(e,i){return b(this,void 0,void 0,(function*(){const o=yield t.promises.open(e,"r");try{const e=y.createHash("md5"),t=[];let r="",s=0;for(;sthis.retryOperation((()=>b(this,void 0,void 0,(function*(){var s;this.taskQueue.setDownloadedSize(0);try{const n=this.config.access_token;let a,d=this.baseFolder+"/"+o;d=d.replace(/\/+/g,"/"),d.startsWith("/")&&(d=d.substring(1));let l=yield this.listFileInfos(o.substring(0,o.lastIndexOf("/")));const c=d.split("/").pop(),u=l.find((e=>e.name===c));if(!u)return console.error("文件不存在:",o),!1;const h=yield e.get("https://pan.baidu.com/rest/2.0/xpan/multimedia",{params:{method:"filemetas",access_token:n,fsids:JSON.stringify([u.fs_id]),dlink:1},headers:{"User-Agent":"pan.baidu.com"}});if(0!==h.data.errno||!(null===(s=h.data.list)||void 0===s?void 0:s[0]))return console.error("获取下载链接失败:",h.data),!1;a=h.data.list[0];const p=a.dlink,f=yield e.get(p,{responseType:"stream",params:{access_token:n},headers:{"User-Agent":"pan.baidu.com"}});let g=0;const y=t.createWriteStream(i.join(this.storagePath,r));f.data.on("data",(e=>{g+=e.length,this.taskQueue.setDownloadedSize(g)})),yield new Promise(((e,t)=>{f.data.pipe(y),y.on("finish",(()=>{e()})),y.on("error",t)}));return(yield this.getFileSize(i.join(this.storagePath,r)))===a.size||(console.error("Downloaded file size does not match expected size."),yield t.promises.unlink(i.join(this.storagePath,r)),!1)}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}class he{constructor(e){this.username=e.username,this.password=e.password,this.url=e.url,this.taskQueue=new E(3)}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{return(yield e.get(`${this.url}/list`,{params:{dir:t},auth:{username:this.username,password:this.password}})).data.files.map((e=>({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modifiedTime})))||[]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{return(yield e.delete(`${this.url}/delete`,{params:{dir:t.split("/").slice(0,-1).join("/")||"",filename:t.split("/").pop()},auth:{username:this.username,password:this.password}})).data.success}catch(e){return console.error("Error deleting file:",e),!1}}))}}const pe=o(r.pipeline);class fe extends he{constructor(e){super(e),this.storagePath=e.storagePath}getAuthHeader(){return`Basic ${btoa(`${this.username}:${this.password}`)}`}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{r.split("/").pop();const s=r.substring(0,r.lastIndexOf("/"))||"";let n=this.listFiles("");const a=new Promise(((e,t)=>{setTimeout((()=>t(new Error("Docker connection timeout"))),5e3)}));yield Promise.race([n,a]);const d=t.createReadStream(i.join(this.storagePath,o)),l=new f;l.append("file",d);const c=yield e.post(`${this.url}/upload?dir=${encodeURIComponent(s)}`,l,{headers:Object.assign(Object.assign({},l.getHeaders()),{Authorization:this.getAuthHeader()}),maxContentLength:1/0,maxBodyLength:1/0});return!(c.status>=300)||(console.error("Error occurred during file upload:",c),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=o.split("/").pop()||"",n=o.substring(0,o.lastIndexOf("/"))||"",a=t.createWriteStream(i.join(this.storagePath,r)),d=yield e({url:`${this.url}/download`,method:"GET",params:{dir:n,filename:s},headers:{Authorization:this.getAuthHeader()},maxContentLength:1/0,maxBodyLength:1/0,responseType:"stream"});if(d.status>=300)return console.error("Error occurred during file download:",d),a.destroy(),t.existsSync(i.join(this.storagePath,r))&&t.unlinkSync(i.join(this.storagePath,r)),!1;let l=0;return d.data.on("data",(e=>{l+=e.length,this.taskQueue.setDownloadedSize(l)})),yield pe(d.data,a),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ge{constructor(e){this.baseUrl="https://proapi.115.com",this.config=e,this.taskQueue=new E(1),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getUploadCredentials(t){return b(this,void 0,void 0,(function*(){try{const i=yield e.get(`${this.baseUrl}/open/upload/get_token`,{headers:{Authorization:`Bearer ${t}`}});return i.status>=300||!i.data.state?(console.error("Error getting upload credentials:",i.data),null):i.data.data}catch(e){return console.error("Error occurred during get upload credentials:",e),null}}))}generateOSSPolicy(e,t,i=new Date(Date.now()+36e5)){const o={expiration:i.toISOString(),conditions:[{bucket:e},{key:t},["starts-with","$success_action_status","2"],["content-length-range",0,1073741824]]};return JSON.stringify(o)}getAuthUrl(e){return`https://passportapi.115.com/open/authorize?client_id=${A}&response_type=code&redirect_uri=${e}`}}class ye extends ge{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(e,t){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){var o;try{const o=this.config.access_token;let r=this.baseFolder+"/"+t;r.startsWith("/")||(r="/"+r);let s=i.dirname(r),n=yield this.getFolderInfo(s,!0),a="0";if(n)a=n.file_id;else{let e=yield this.createFolder(s);if(!e)return console.error("Failed to create folder:",s),!1;a=e}const d=i.join(this.storagePath,e),l=yield this.getFileSize(d),c=yield this.calculateFileSha1(d),u=yield this.calculatePreSha1(d),h=i.basename(t);yield this.deleteFileWithoutQueue(t);let p=yield this.initializeUpload(a,h,l,c,u,o);if(!p)return console.error("Failed to initialize upload"),!1;if((6===p.status||7===p.status||8===p.status)&&(p=yield this.handleSecondAuth(a,p,d,h,l,c,u,o),!p))return console.error("Second authentication failed"),!1;if(2===p.status)return console.info(`File ${e} uploaded successfully via instant upload.`),!0;const f=yield this.getUploadCredentials(o);if(!f)return console.error("Failed to get upload credentials"),!1;return(yield this.uploadToObjectStorage(d,p,f))?(console.info(`File ${e} uploaded successfully.`),!0):(console.error("Failed to upload to object storage"),!1)}catch(e){return console.error("Error occurred during file upload:",(null===(o=e.response)||void 0===o?void 0:o.data)||e.message||e),!1}}))))))}))}calculateFileSha1(e){return b(this,void 0,void 0,(function*(){return new Promise(((i,o)=>{const r=y.createHash("sha1"),s=t.createReadStream(e);s.on("data",(e=>{r.update(e)})),s.on("end",(()=>{i(r.digest("hex"))})),s.on("error",(e=>{o(e)}))}))}))}calculatePreSha1(e){return b(this,void 0,void 0,(function*(){return new Promise(((i,o)=>{const r=y.createHash("sha1"),s=t.createReadStream(e,{start:0,end:131071});s.on("data",(e=>{r.update(e)})),s.on("end",(()=>{i(r.digest("hex"))})),s.on("error",(e=>{o(e)}))}))}))}handleSecondAuth(e,i,o,r,s,n,a,d){return b(this,void 0,void 0,(function*(){try{if(!i.sign_check)return console.error("No sign_check provided for second authentication"),null;const[l,c]=i.sign_check.split("-"),u=parseInt(l),h=parseInt(c),p=Buffer.alloc(h-u+1),f=yield t.promises.open(o,"r");try{yield f.read(p,0,p.length,u);const t=y.createHash("sha1");t.update(p);const o=t.digest("hex").toUpperCase();return yield this.initializeUpload(e,r,s,n,a,d,i.sign_key,o,i.pick_code)}finally{yield f.close()}}catch(e){return console.error("Error during second authentication:",e),null}}))}calculateOSSSignature(e,t){const i=Buffer.from(t).toString("base64");return y.createHmac("sha1",e).update(i).digest("base64")}uploadToObjectStorage(o,r,s){var n;return b(this,void 0,void 0,(function*(){try{const n=s.endpoint,a=r.bucket,d=r.object;let l;if(n.includes(a))l=n;else{l=`https://${a}.${n.replace(/^https?:\/\//,"")}`}const c=this.generateOSSPolicy(a,d),u=this.calculateOSSSignature(s.AccessKeySecret,c),h=Buffer.from(c).toString("base64"),p=new f;if(p.append("key",d),p.append("policy",h),p.append("OSSAccessKeyId",s.AccessKeyId),p.append("signature",u),p.append("x-oss-security-token",s.SecurityToken),p.append("success_action_status","200"),r.callback&&r.callback.callback){const e=Buffer.from(r.callback.callback).toString("base64");if(p.append("callback",e),r.callback.callback_var){const e=JSON.parse(r.callback.callback_var);for(const[t,i]of Object.entries(e))p.append(t,String(i))}}const g=t.createReadStream(o);p.append("file",g,i.basename(o));const y=yield e.post(l,p,{headers:Object.assign({},p.getHeaders()),maxContentLength:1/0,maxBodyLength:1/0});return 200===y.status||204===y.status||(console.error("Upload failed with status:",y.status),!1)}catch(e){return console.error("Error uploading file via REST API:",(null===(n=e.response)||void 0===n?void 0:n.data)||e.message||e),!1}}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let s=this.baseFolder+"/"+o;s=s.replace(/\/+/g,"/"),s.startsWith("/")||(s="/"+s);const n=yield this.getFolderInfo(s,!1);if(!n||!n.pick_code)return console.error("Failed to get file info or pick_code for:",o),!1;const a=yield this.getFileDownloadUrl(n.pick_code);if(!a)return console.error("Failed to get download URL for:",o),!1;const d=yield e.get(a.url,{responseType:"stream"});let l=0;const c=t.createWriteStream(i.join(this.storagePath,r));return d.data.on("data",(e=>{l+=e.length,this.taskQueue.setDownloadedSize(l)})),yield new Promise(((e,t)=>{d.data.pipe(c),c.on("finish",(()=>{e()})),c.on("error",t)})),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;(t=this.baseFolder+"/"+t).startsWith("/")||(t="/"+t);let o=[],r=0;const s=1150;let n=!0,a=yield this.getFolderInfo(t,!0),d="";if(a)d=a.file_id;else{let e=yield this.createFolder(t);if(!e)return console.error("Failed to create folder:",t),[];d=e}if(!d)return console.error("Failed to get or create folder ID:",t),[];let l=d;for(;n;){const t={offset:r,limit:s,cur:1,show_dir:1};l&&(t.cid=l);const a=yield e.get(`${this.baseUrl}/open/ufile/files`,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},params:t});if(a.status>=300)break;const d=a.data.data||[];o=o.concat(d),d.length({name:e.fn,size:e.fs||0,type:"0"===e.fc?"folder":"file",modified:new Date(1e3*e.upt).toISOString()})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}getFileDownloadUrl(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=new f;o.append("pick_code",t);const r=yield e.post(`${this.baseUrl}/open/ufile/downurl`,o,{headers:Object.assign({Authorization:`Bearer ${i}`},o.getHeaders())});if(r.status>=300)return console.error("Error getting download URL:",r.data),null;const s=r.data.data,n=Object.keys(s)[0];return n&&s[n]?s[n].url:(console.error("No file data found in download URL response"),null)}catch(e){return console.error("Error occurred during get download URL:",e),null}}))}initializeUpload(t,i,o,r,s,n,a,d,l){return b(this,void 0,void 0,(function*(){try{const c=new f;c.append("file_name",i),c.append("file_size",o.toString()),t?c.append("target","U_1_"+t):c.append("target","U_1_0"),c.append("fileid",r),c.append("preid",s),c.append("topupload","0"),l&&c.append("pick_code",l),a&&c.append("sign_key",a),d&&c.append("sign_val",d);const u=yield e.post(`${this.baseUrl}/open/upload/init`,c,{headers:Object.assign({Authorization:`Bearer ${n}`},c.getHeaders())});return u.status>=300||!u.data.state?(console.error("Error initializing upload:",u.data),null):u.data.data}catch(e){return console.error("Error occurred during upload initialization:",e),null}}))}createFolder(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=t.replace(/^\/+|\/+$/g,"");if(!o)return"";const r=o.split("/");let s="",n="0";for(const t of r){s=s?`${s}/${t}`:t;const o=yield this.getFolderInfo(s,!0);if(o&&o.file_id)n=o.file_id;else{const o=new f;o.append("pid",n),o.append("file_name",t);const r=yield e.post(`${this.baseUrl}/open/folder/add`,o,{headers:Object.assign({Authorization:`Bearer ${i}`},o.getHeaders())});if(r.status>=300||!r.data.state)return console.error("Error creating folder:",r.data),"";n=r.data.data.file_id}}return n}catch(e){return console.error("Error occurred during folder creation:",e),""}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;t=this.baseFolder+"/"+t;let o=yield this.getFolderInfo(t,!1);if(!o)return!0;let r=new f;r.append("file_ids",o.file_id);const s=yield e.post(`${this.baseUrl}/open/ufile/delete`,r,{headers:Object.assign({Authorization:`Bearer ${i}`},r.getHeaders())});return!(s.status>=300||!s.data.state)||(console.error("Error deleting file:",s),!1)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getFolderInfo(t,i){return b(this,void 0,void 0,(function*(){if(""===t||"/"===t)return{file_id:"0"};t.startsWith("/")||(t="/"+t);try{const i=this.config.access_token;let o=new f;o.append("path",t);const r=yield e.post(`${this.baseUrl}/open/folder/get_info`,o,{headers:Object.assign(Object.assign({},o.getHeaders()),{Authorization:`Bearer ${i}`})});return r.status>=300||!r.data.state||0===r.data.data.length?(console.error("Error getting file info:",r.data),null):r.data.data}catch(e){return console.error("Error occurred during get file info:",e),null}}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}const me=()=>{let e="";if("darwin"===process.platform){const o=i.join(m.homedir(),"Library","Mobile Documents","iCloud~com~koodoreader~expo","Documents");t.existsSync(o)&&(e=o)}return e&&t.existsSync(e)&&t.existsSync(e)?e:""};class ve{constructor(e){this.config=e,this.storagePath=e.storagePath,this.taskQueue=new E(5)}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){let s=me();if(!s)return console.error("iCloud Drive path not found"),void r(!1);let n=s+"/"+o,a=s+"/"+i.dirname(o);t.existsSync(a)||t.mkdirSync(a,{recursive:!0}),t.existsSync(n)&&t.unlinkSync(n),t.copyFile(i.join(this.storagePath,e),n,(e=>{e?(console.error("Error uploading file:",e),r(!1)):r(!0)}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){let s=me();if(!s)return console.error("iCloud Drive path not found"),void r(!1);let n=s+"/"+e,a=i.join(this.storagePath,o);if(!t.existsSync(n))return console.error("File does not exist in iCloud:",e),void r(!1);t.existsSync(a)&&t.unlinkSync(a),t.copyFile(n,a,(e=>{if(e)console.error("Error downloading file:",e),r(!1);else{let e=t.statSync(a);this.taskQueue.setDownloadedSize(e.size),r(!0)}}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){const o=()=>new Promise(((o,r)=>b(this,void 0,void 0,(function*(){let r=me();if(!r)return console.error("iCloud Drive path not found"),void o([]);let s=r+"/"+e;t.existsSync(s)||t.mkdirSync(s,{recursive:!0}),t.readdir(s,{withFileTypes:!0},((e,r)=>{if(e)return console.error("Error reading directory:",e),void o([]);let n=r.map((e=>{let o=i.join(s,e.name),r=t.statSync(o);return{name:e.name,size:r.size,type:e.isDirectory()?"folder":"file",modified:r.mtime.toISOString()}}));o(n)}))}))));try{return yield o()}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){try{return yield new Promise(((i,o)=>{let r=me();if(!r)return console.error("iCloud Drive path not found"),void i(!1);let s=r+"/"+e;t.unlink(s,(e=>{e?(console.error("Error deleting file:",e),i(!1)):i(!0)}))}))}catch(e){return console.error(e),!1}}))}}class ke{constructor(e){this.config=e,this.storagePath=e.storagePath,this.drivePath=e.drivePath,this.taskQueue=new E(5)}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void r(!1);let s=this.drivePath+"/"+o,n=this.drivePath+"/"+i.dirname(o);t.existsSync(n)||t.mkdirSync(n,{recursive:!0}),t.existsSync(s)&&t.unlinkSync(s),t.copyFile(i.join(this.storagePath,e),s,(e=>{e?(console.error("Error uploading file:",e),r(!1)):r(!0)}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void r(!1);let s=this.drivePath+"/"+e,n=i.join(this.storagePath,o);if(!t.existsSync(s))return console.error("File does not exist in path:",e),void r(!1);t.existsSync(n)&&t.unlinkSync(n),t.copyFile(s,n,(e=>{if(e)console.error("Error downloading file:",e),r(!1);else{let e=t.statSync(n);this.taskQueue.setDownloadedSize(e.size),r(!0)}}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){const o=()=>new Promise(((o,r)=>b(this,void 0,void 0,(function*(){if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void o([]);let r=this.drivePath+"/"+e;t.existsSync(r)||t.mkdirSync(r,{recursive:!0}),t.readdir(r,{withFileTypes:!0},((e,s)=>{if(e)return console.error("Error reading directory:",e),void o([]);let n=s.map((e=>{let o=i.join(r,e.name),s=t.statSync(o);return{name:e.name,size:s.size,type:e.isDirectory()?"folder":"file",modified:s.mtime.toISOString()}}));o(n)}))}))));try{return yield o()}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){const i=()=>new Promise(((i,o)=>{if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void i(!1);let r=this.drivePath+"/"+e;t.unlink(r,(e=>{e?(console.error("Error deleting file:",e),i(!1)):i(!0)}))}));try{return yield i()}catch(e){return console.error(e),!1}}))}}const be=["book","config","cover","font"];class Fe{constructor(e,t){this.type=e,this.storagePath=t.storagePath,this.remote="dropbox"===e?new D(t):"microsoft"===e?new W(t):"google"===e?new K(t):"microsoft_exp"===e?new W(Object.assign(Object.assign({},t),{isExp:!0})):"google_exp"===e?new K(Object.assign(Object.assign({},t),{isExp:!0})):"s3compatible"===e?new q(t):"webdav"===e?new V(t):"docker"===e?new fe(t):"ftp"===e?new B(t):"sftp"===e?new Z(t):"boxnet"===e?new ie(t):"mega"===e?new re(t):"adrive"===e?new ne(t):"pcloud"===e?new de(t):"dubox"===e?new ue(t):"yandex"===e?new G(t):"yiyiwu"===e?new ye(t):"icloud"===e?new ve(t):"folder"===e?new ke(t):new ee}downloadFile(e,o,r){return b(this,void 0,void 0,(function*(){if(t.existsSync(i.join(this.storagePath+"/"+r))||t.mkdirSync(i.join(this.storagePath+"/"+r)),"cover"!==r){if(!(yield this.listFiles(r)).find((t=>e.indexOf(t)>-1)))return!1}return yield this.remote.downloadFile(r+"/"+e,r+"/"+o)}))}uploadFile(e,o,r){return b(this,void 0,void 0,(function*(){const s=i.join(this.storagePath,r,e);return!(!t.existsSync(s)||0!==t.statSync(s).size)||(yield this.remote.uploadFile(r+"/"+e,r+"/"+o))}))}deleteFile(e,t){return b(this,void 0,void 0,(function*(){return!!(yield this.listFiles(t)).find((t=>e.indexOf(t)>-1))&&(yield this.remote.deleteFile(t+"/"+e))}))}isExist(e,t){return b(this,void 0,void 0,(function*(){return(yield this.listFiles(t)).find((t=>-1!==t.indexOf(e)))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return yield this.remote.listFiles(e)}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){return yield this.remote.listFileInfos(e)}))}downloadAllFiles(){return b(this,void 0,void 0,(function*(){for(let e of be){let t=yield this.listFiles(e);for(let i of t)yield this.downloadFile(i,i,e)}}))}getAuthUrl(e){return this.remote.getAuthUrl(e)}getStats(){return this.remote.taskQueue.getStats()}clearQueue(){return this.remote.taskQueue.clearQueue()}resetCounters(){this.remote.taskQueue.resetCounters()}getDownloadedSize(){return this.remote.taskQueue.getDownloadedSize()}}const we={words:['ALTER TABLE words ADD COLUMN "sentence" text']},Ee={notes:"SELECT * FROM notes WHERE key = ?",bookmarks:"SELECT * FROM bookmarks WHERE key = ?",books:"SELECT * FROM books WHERE key = ?",plugins:"SELECT * FROM plugins WHERE key = ?",words:"SELECT * FROM words WHERE key = ?"},Se={notes:"SELECT * FROM notes WHERE bookKey = ?",bookmarks:"SELECT * FROM bookmarks WHERE bookKey = ?",words:"SELECT * FROM words WHERE bookKey = ?",books:"SELECT * FROM books WHERE key = ?"},Te={notes:"DELETE FROM notes WHERE bookKey = ?",bookmarks:"DELETE FROM bookmarks WHERE bookKey = ?",words:"DELETE FROM words WHERE bookKey = ?"};function Oe(e){for(const t in e)e.hasOwnProperty(t)&&(e[`temp-${t}`]=e[t]);return e}const xe={notes:e=>{let t=Object.assign({},e);return t.date=JSON.parse(e.date),t.tag=JSON.parse(e.tag),t},bookmarks:e=>e,books:e=>e,plugins:e=>{let t=Object.assign({},e);return e.autoValue||delete t.autoValue,e.langList?t.langList=JSON.parse(e.langList):delete t.langList,e.voiceList?t.voiceList=JSON.parse(e.voiceList):delete t.voiceList,t.config=JSON.parse(e.config),t},words:e=>{let t=Object.assign({},e);return t.date=JSON.parse(e.date),void 0===t.sentence&&(t.sentence=""),t}};var Re={sqlStatement:{createTableStatement:Oe({notes:'\n CREATE TABLE IF NOT EXISTS "notes" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "chapter" text,\n "chapterIndex" integer,\n "text" text,\n "cfi" text,\n "range" text,\n "notes" text,\n "percentage" text,\n "color" integer,\n "tag" array\n )\n ',bookmarks:'\n CREATE TABLE IF NOT EXISTS "bookmarks" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "cfi" text,\n "label" text,\n "percentage" text,\n "chapter" text\n );\n ',books:'\n CREATE TABLE IF NOT EXISTS "books" (\n "key" text PRIMARY KEY,\n "name" text,\n "author" text,\n "description" text,\n "md5" text,\n "cover" text,\n "format" text,\n "publisher" text,\n "size" integer,\n "page" integer,\n "path" text,\n "charset" text\n );\n ',plugins:'\n CREATE TABLE IF NOT EXISTS "plugins" (\n "key" text PRIMARY KEY,\n "type" text,\n "displayName" text,\n "icon" text,\n "version" text,\n "config" object,\n "autoValue" string,\n "langList" text,\n "voiceList" text,\n "scriptSHA256" text,\n "script" text\n );\n ',words:'\n CREATE TABLE IF NOT EXISTS "words" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "word" text,\n "sentence" text,\n "chapter" text\n );\n '}),migrateStatement:Oe(we),getAllStatement:Oe({notes:"SELECT * FROM notes",bookmarks:"SELECT * FROM bookmarks",books:"SELECT * FROM books",plugins:"SELECT * FROM plugins",words:"SELECT * FROM words"}),getPagedStatement:Oe({notes:"SELECT * FROM notes LIMIT ? OFFSET ?",bookmarks:"SELECT * FROM bookmarks LIMIT ? OFFSET ?",books:"SELECT * FROM books LIMIT ? OFFSET ?",plugins:"SELECT * FROM plugins LIMIT ? OFFSET ?",words:"SELECT * FROM words LIMIT ? OFFSET ?"}),getCountStatement:Oe({notes:"SELECT COUNT(*) as count FROM notes",bookmarks:"SELECT COUNT(*) as count FROM bookmarks",books:"SELECT COUNT(*) as count FROM books",plugins:"SELECT COUNT(*) as count FROM plugins",words:"SELECT COUNT(*) as count FROM words"}),saveStatement:Oe({notes:"INSERT OR REPLACE INTO notes (key, bookKey, chapter, chapterIndex, text, cfi, range, notes, date, percentage, color, tag) VALUES (@key, @bookKey, @chapter, @chapterIndex, @text, @cfi, @range, @notes, @date, @percentage, @color, @tag)",bookmarks:"INSERT OR REPLACE INTO bookmarks (key, bookKey, cfi, label, percentage, chapter) VALUES (@key, @bookKey, @cfi, @label, @percentage, @chapter)",books:"INSERT OR REPLACE INTO books (key, name, author, description, md5, cover, format, publisher, size, page, path, charset) VALUES (@key, @name, @author, @description, @md5, @cover, @format, @publisher, @size, @page, @path, @charset)",plugins:"INSERT OR REPLACE INTO plugins (key, type, displayName, icon, version, config, autoValue, langList, voiceList, scriptSHA256, script) VALUES (@key, @type, @displayName, @icon, @version, @config, @autoValue, @langList, @voiceList, @scriptSHA256, @script)",words:"INSERT OR REPLACE INTO words (key, bookKey, date, word, sentence, chapter) VALUES (@key, @bookKey, @date, @word, @sentence, @chapter)"}),deleteAllStatement:Oe({notes:"DELETE FROM notes",bookmarks:"DELETE FROM bookmarks",books:"DELETE FROM books",plugins:"DELETE FROM plugins",words:"DELETE FROM words"}),updateStatement:Oe({notes:"UPDATE notes SET bookKey = @bookKey, chapter = @chapter, chapterIndex = @chapterIndex, text = @text, cfi = @cfi, range = @range, notes = @notes, date = @date, percentage = @percentage, color = @color, tag = @tag WHERE key = @key",bookmarks:"UPDATE bookmarks SET bookKey = @bookKey, cfi = @cfi, label = @label, percentage = @percentage, chapter = @chapter WHERE key = @key",books:"UPDATE books SET name = @name, author = @author, description = @description, md5 = @md5, cover = @cover, format = @format, publisher = @publisher, size = @size, page = @page, path = @path, charset = @charset WHERE key = @key",plugins:"UPDATE plugins SET type = @type, displayName = @displayName, icon = @icon, version = @version, config = @config, autoValue = @autoValue, langList = @langList, voiceList = @voiceList, scriptSHA256 = @scriptSHA256, script = @script WHERE key = @key",words:"UPDATE words SET bookKey = @bookKey, date = @date, word = @word, sentence = @sentence, chapter = @chapter WHERE key = @key"}),deleteStatement:Oe({notes:"DELETE FROM notes WHERE key = ?",bookmarks:"DELETE FROM bookmarks WHERE key = ?",books:"DELETE FROM books WHERE key = ?",plugins:"DELETE FROM plugins WHERE key = ?",words:"DELETE FROM words WHERE key = ?"}),dropStatement:Oe({notes:"DROP TABLE IF EXISTS notes",bookmarks:"DROP TABLE IF EXISTS bookmarks",books:"DROP TABLE IF EXISTS books",plugins:"DROP TABLE IF EXISTS plugins",words:"DROP TABLE IF EXISTS words"}),getStatement:Oe(Ee),getByBookKeyStatement:Oe(Se),getByBookKeysStatement:Oe({notes:e=>`SELECT * FROM notes WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,bookmarks:e=>`SELECT * FROM bookmarks WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,words:e=>`SELECT * FROM words WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")})`}),getKeysStatement:Oe({notes:"SELECT key FROM notes",bookmarks:"SELECT key FROM bookmarks",books:"SELECT key FROM books",plugins:"SELECT key FROM plugins",words:"SELECT key FROM words"}),getWithSortAndPageStatement:Oe({notes:(e,t,i,o)=>`SELECT * FROM notes ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,bookmarks:(e,t,i,o)=>`SELECT * FROM bookmarks ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,books:(e,t,i,o)=>`SELECT * FROM books ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,plugins:(e,t,i,o)=>`SELECT * FROM plugins ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,words:(e,t,i,o)=>`SELECT * FROM words ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`}),getByKeysStatement:Oe({notes:e=>`SELECT * FROM notes WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,bookmarks:e=>`SELECT * FROM bookmarks WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,plugins:e=>`SELECT * FROM plugins WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,words:e=>`SELECT * FROM words WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`}),deleteByBookKeyStatement:Oe(Te)},jsonToSqlite:Oe({notes:e=>{let t=Object.assign({},e);return t.date=JSON.stringify(e.date),t.tag=JSON.stringify(e.tag),t},bookmarks:e=>e,books:e=>{let t=Object.assign({},e);return t.page=e.page||0,t},plugins:e=>{let t=Object.assign({},e);return e.autoValue||(t.autoValue=null),e.langList?t.langList=JSON.stringify(e.langList):t.langList=null,e.voiceList?t.voiceList=JSON.stringify(e.voiceList):t.voiceList=null,t.config=JSON.stringify(e.config),t},words:e=>{let t=Object.assign({},e);return t.date=JSON.stringify(e.date),void 0===t.sentence&&(t.sentence=""),t}}),sqliteToJson:Oe(xe)};const Ce=S,_e=T;class Pe{constructor(e,t,i){this.TokenService=e,this.ConfigService=t,this.baseUrl="china"===i?_e:Ce,this.serverRegion=i,this.refreshToken="",this.accessToken="",this.streamPromise=null,this.expiresAt=0}refreshUserToken(){return b(this,void 0,void 0,(function*(){if(this.refreshToken=yield this.TokenService.getToken("refresh_token"),!this.refreshToken)return{code:401,message:"refresh token not found"};let t=(yield e.post(this.baseUrl+"/api/v1/public/user/refresh_token",{refresh_token:this.refreshToken})).data;return 200===t.code&&(yield this.TokenService.setToken("access_token",t.data.access_token),yield this.TokenService.setToken("refresh_token",t.data.refresh_token),yield this.TokenService.setToken("expires_at",(1e3*t.data.expires_at).toString()),this.accessToken=t.data.access_token,this.refreshToken=t.data.refresh_token,this.expiresAt=1e3*t.data.expires_at),t}))}requestWithRetry(e){return b(this,void 0,void 0,(function*(){return Pe.requestQueue||(Pe.requestQueue=[]),new Promise(((t,i)=>{Pe.requestQueue.push({config:e,resolve:t,reject:i}),Pe.processingQueue||this.processQueue()}))}))}isTokenValid(){return b(this,void 0,void 0,(function*(){if(this.accessToken||(this.accessToken=(yield this.TokenService.getToken("access_token"))||""),!this.expiresAt){const e=yield this.TokenService.getToken("expires_at");this.expiresAt=e?parseInt(e):(new Date).getTime()+31536e9}return""!==this.accessToken&&this.expiresAt>(new Date).getTime()+6e4}))}processQueue(){return b(this,void 0,void 0,(function*(){if(!Pe.processingQueue){Pe.processingQueue=!0;try{for(;Pe.requestQueue.length>0;){const e=Pe.requestQueue.shift();try{let t=yield this.executeRequest(e.config);e.resolve(t)}catch(t){e.reject(t)}}}finally{Pe.processingQueue=!1}}}))}executeRequest(t){return b(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let i="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);if(t.baseURL=this.baseUrl,t.headers)t.headers.Authorization="Bearer "+this.accessToken,t.headers["X-Request-ID"]=i;else{let e=this.ConfigService.getItem("appVersion"),o=this.ConfigService.getItem("appPlatform");t.headers={Authorization:"Bearer "+this.accessToken,"X-Request-ID":i,"X-App-Version":e||"1.0.0","X-App-Platform":o||"web"}}let o=(yield e(t)).data;if(402===o.code){let i=yield this.refreshUserToken();if(200===i.code){return t.headers=t.headers||{},t.headers.Authorization="Bearer "+this.accessToken,(yield e(t)).data}return i}return 200!==o.code&&console.error("Request error:",o),o}catch(e){return console.error("Request execution error:",e),"Network Error"===e.message?{code:503,message:"network error",data:null,msg:"Network error, please try again later. 网络错误,请稍后再试。"}:{code:500,message:e.message||"Unknown error",msg:e.message||"Unknown error",data:null}}}))}requestWithStream(e,t,i){return b(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>b(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let o=this.accessToken||"",r="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((s,n)=>{let a=this.ConfigService.getItem("appVersion"),d=this.ConfigService.getItem("appPlatform");const l=new i(this.baseUrl+e.url,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+o,"X-Request-ID":r,"X-App-Version":a||"1.0.0","X-App-Platform":d||"web"},method:e.method,body:JSON.stringify(e.data),pollingInterval:0});l.addEventListener("open",(()=>{console.info("Connection to OpenAI established.")})),l.addEventListener("message",(e=>b(this,void 0,void 0,(function*(){if(!e.data)return;const i=JSON.parse(e.data);i.done?(l.close(),s(i)):t(i.data)})))),l.addEventListener("error",(e=>{if(console.info("Error:",e),!e.data)return;const i=JSON.parse(e.data);t(i.data),s(i),l.close()}))}))}finally{this.streamPromise=null}})))()),this.streamPromise}))}requestWithFetch(e,t){return b(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>b(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let i=this.accessToken||"",o="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((r,s)=>b(this,void 0,void 0,(function*(){let s=this.ConfigService.getItem("appVersion"),n=this.ConfigService.getItem("appPlatform");var a=new v(this.baseUrl+e.url,{headers:{"Content-Type":"text/plain",Authorization:"Bearer "+i,"X-Request-ID":o,"X-App-Version":s||"1.0.0","X-App-Platform":n||"web"},payload:JSON.stringify(e.data),method:"POST"});a.addEventListener("message",(e=>b(this,void 0,void 0,(function*(){if(!e.data)return;const i=JSON.parse(e.data);i.done?(a.close(),r(i)):t(i.data)})))),a.addEventListener("open",(e=>{console.info(e,"Connection to OpenAI established.")})),a.addEventListener("error",(e=>{if(console.error(e,"Error occurred while connecting to OpenAI"),!e.data)return;const i=JSON.parse(e.data);t(i.data),r(i),a.close()}))}))))}finally{this.streamPromise=null}})))()),this.streamPromise}))}}Pe.processingQueue=!1,Pe.requestQueue=[];class Ae extends Pe{constructor(e,t,i){super(e,t,i),this.serverRegion=i}encryptToken(e){return b(this,void 0,void 0,(function*(){let t=e.token,i=w.encode(t),{extracted:o,remaining:r}=function(e){let t="",i="",o=[],r=1;for(;r<=e.length;)o.push(r-1),r*=2;for(let r=0;r-1){let i=t.split("#");e.encrypted_token=i[1]}const i={method:"post",url:"/api/v1/pro/thirdparty/decrypt_token",data:e};let o=yield this.requestWithRetry(i);if(t.indexOf("#")>-1&&o.data&&o.data.token){let e=t.split("#"),i=function(e,t){let i="",o=[],r=1,s=e.length+t.length;for(;r<=s;)o.push(r-1),r*=2;let n=0,a=0;for(let r=0;r-1&&i.splice(o,1),this.setAllListConfig(i,t)}static setListConfig(e,t){let i=this.getAllListConfig(t);const o=i.indexOf(e);o>-1?(i.splice(o,1),i.unshift(e)):i.unshift(e),this.setAllListConfig(i,t)}static setAllListConfig(e,t,i=!0){this.setItem(t,JSON.stringify(e)),i&&this.setSyncRecord({type:"config",catergory:"listConfig",name:"general",key:t},{operation:"update",time:Date.now()})}static setObjectConfig(e,t,i,o=!0){let r=this.getAllObjectConfig(i);r[e]=t,o&&this.setSyncRecord({type:"config",catergory:"objectConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllObjectConfig(r,i)}static getObjectConfig(e,t,i){return this.getAllObjectConfig(t)[e]||i}static getAllObjectConfig(e){let t=this.getItem(e);return JSON.parse(t)||{}}static setAllObjectConfig(e,t){this.setItem(t,JSON.stringify(e))}static deleteObjectConfig(e,t){let i=this.getAllObjectConfig(t);delete i[e],this.setSyncRecord({type:"config",catergory:"objectConfig",name:t,key:e},{operation:"delete",time:Date.now()}),this.setAllObjectConfig(i,t)}static getAllMapConfig(e){let t=this.getItem(e);return JSON.parse(t)||{}}static getMapConfig(e,t){return this.getAllMapConfig(t)[e]||[]}static setAllMapConfig(e,t){this.setItem(t,JSON.stringify(e))}static setMapConfig(e,t,i){let o=this.getAllMapConfig(i);void 0===o[e]&&(o[e]=[]),t&&-1===o[e].indexOf(t)&&o[e].unshift(t),this.setSyncRecord({type:"config",catergory:"mapConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,i)}static setOneMapConfig(e,t,i,o=!0){let r=this.getAllMapConfig(i);r[e]=t,o&&this.setSyncRecord({type:"config",catergory:"mapConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(r,i)}static deleteFromMapConfig(e,t,i){let o=this.getAllMapConfig(i),r=o[e].indexOf(t);o[e].splice(r,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,i)}static deleteFromAllMapConfig(e,t){let i=this.getAllMapConfig(t);Object.keys(i).forEach((o=>{let r=i[o].indexOf(e);r>-1&&(i[o].splice(r,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:o},{operation:"update",time:Date.now()}))})),this.setAllMapConfig(i,t)}static deleteMapConfig(e,t){let i=this.getAllMapConfig(t);delete i[e],this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"delete",time:Date.now()}),this.setAllMapConfig(i,t)}static getFromAllMapConfig(e,t){let i=this.getAllMapConfig(t),o=[];for(let t in i)i[t]&&i[t].indexOf(e)>-1&&o.push(t);return o}static getSyncRecord(e){return JSON.parse(this.getItem("syncRecord")||"{}")[e.type+"."+e.catergory+"."+e.name+"."+e.key]||{operation:"",time:0}}static getAllSyncRecord(){return JSON.parse(this.getItem("syncRecord")||"{}")}static setSyncRecord(e,t){const i=e.type+"."+e.catergory+"."+e.name+"."+e.key;let o=JSON.parse(this.getItem("syncRecord")||"{}");o[i]=t,this.setItem("syncRecord",JSON.stringify(o))}static setAllSyncRecord(e){this.setItem("syncRecord",JSON.stringify(e))}});var Le,ze;export{$e as ConfigService,Re as SqlStatement,Fe as SyncUtil,Ae as ThirdpartyRequest}; +import e from"axios";import t from"fs";import i from"path";import{promisify as o}from"util";import r from"stream";import{Client as s}from"basic-ftp";import{S3Client as n,ListObjectsV2Command as a,DeleteObjectCommand as d,PutObjectCommand as l,GetObjectCommand as c}from"@aws-sdk/client-s3";import{AuthType as u,createClient as h}from"webdav";import p from"ssh2-sftp-client";import f from"form-data";import{Storage as g}from"megajs";import y from"crypto";import m from"os";import{SSE as v}from"sse.js";import k from"electron-store";function b(e,t,i,o){return new(i||(i=Promise))((function(r,s){function n(e){try{d(o.next(e))}catch(e){s(e)}}function a(e){try{d(o.throw(e))}catch(e){s(e)}}function d(e){var t;e.done?r(e.value):(t=e.value,t instanceof i?t:new i((function(e){e(t)}))).then(n,a)}d((o=o.apply(e,t||[])).next())}))}const F=e=>"json"===e?"application/json":["jpg","jpeg","png","gif","bmp"].includes(e)?"image/"+e:"zip"===e?"application/zip":"epub"===e?"application/epub+zip":"txt"===e?"text/plain":"pdf"===e?"application/pdf":"mobi"===e?"application/x-mobipocket-ebook":"azw3"===e||"azw"===e?"application/vnd.amazon.ebook":"cbz"===e?"application/x-cbz":"cbr"===e?"application/x-cbr":"cbt"===e?"application/x-cbt":"cb7"===e?"application/x-cb7":"fb2"===e?"application/x-fictionbook+xml":"html"===e?"text/html":"css"===e?"text/css":"js"===e?"application/javascript":"xml"===e?"application/xml":"xhtml"===e?"application/xhtml+xml":"opf"===e?"application/oebps-package+xml":"ncx"===e?"application/x-dtbncx+xml":"mp3"===e?"audio/mpeg":"wav"===e?"audio/wav":"ogg"===e?"audio/ogg":"mp4"===e?"video/mp4":"webm"===e?"video/webm":"avi"===e?"video/x-msvideo":"wmv"===e?"video/x-ms-wmv":"flv"===e?"video/x-flv":"m3u8"===e?"application/x-mpegURL":"ts"===e?"video/MP2T":"3gp"===e?"video/3gpp":"3g2"===e?"video/3gpp2":"db"===e?"application/x-sqlite3":void 0,w={_chars:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",encode(e){if("string"!=typeof e)throw new Error("Input must be a string");let t="",i=0;const o=this._stringToUtf8Bytes(e),r=o.length;for(;i>2,d=(3&e)<<4|s>>4,l=(15&s)<<2|n>>6,c=63&n;t+=this._chars.charAt(a),t+=this._chars.charAt(d),t+=i-2>=r?"=":this._chars.charAt(l),t+=i-1>=r?"=":this._chars.charAt(c)}return t},decode(e){if("string"!=typeof e)throw new Error("Input must be a string");for(e=e.replace(/[^A-Za-z0-9+/]/g,"");e.length%4!=0;)e+="=";const t=[];let i=0;const o=e.length;for(;i>4,d=(15&r)<<4|s>>2,l=(3&s)<<6|n;t.push(a),-1!==s&&t.push(d),-1!==n&&t.push(l)}return this._utf8BytesToString(t)},_stringToUtf8Bytes(e){const t=[];for(let i=0;i>6),t.push(128|63&o);else if(55296==(64512&o)&&i+1>18),t.push(128|e>>12&63),t.push(128|e>>6&63),t.push(128|63&e)}else t.push(239,191,189),i--}else t.push(224|o>>12),t.push(128|o>>6&63),t.push(128|63&o)}return t},_utf8BytesToString(e){let t="",i=0;for(;i65535){const i=e-65536;t+=String.fromCharCode(55296|i>>10),t+=String.fromCharCode(56320|1023&i)}else t+=String.fromCharCode(e)}else t+="�"}else t+="�"}return t},encodeURL(e){return this.encode(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=/g,"")},decodeURL(e){for(e=e.replace(/-/g,"+").replace(/_/g,"/");e.length%4;)e+="=";return this.decode(e)}};class E{constructor(e){this.queue=[],this.runningTasks=0,this.totalTasks=0,this.completedTasks=0,this.hasFailedTasks=!1,this.downloadedSize=0,this.maxConcurrency=e}addTask(e){return b(this,void 0,void 0,(function*(){return this.totalTasks++,new Promise(((t,i)=>{if(this.hasFailedTasks)return void t(void 0);const o=()=>b(this,void 0,void 0,(function*(){if(this.hasFailedTasks)return this.completedTasks++,void t(void 0);try{this.runningTasks++;const i=yield e();return this.completedTasks++,t(i),i}catch(e){throw this.completedTasks++,i(e),e}finally{this.runningTasks--,this.runNext()}}));this.runningTasks0;){const e=this.queue.shift();e&&e()}else if(this.queue.length>0&&this.runningTasks=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=[],r=!0,s=null;for(;r;){let n;n=s?yield e.post("https://api.dropboxapi.com/2/files/list_folder/continue",{cursor:s},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}}):yield e.post("https://api.dropboxapi.com/2/files/list_folder",{path:"/"+t,limit:2e3},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});const a=n.data.entries||[];o=o.concat(a),r=n.data.has_more,s=n.data.cursor}return[...new Set(o.map((e=>({name:e.name,size:e.size||0,type:e[".tag"],modified:e.client_modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;yield e.post("https://api.dropboxapi.com/2/files/delete_v2",{path:"/"+t},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});return!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://www.dropbox.com/oauth2/authorize?response_type=code&token_access_type=offline&client_id=${x}&redirect_uri=${e}`}}const j=o(r.pipeline);class D extends Q{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token,n=t.createReadStream(i.join(this.storagePath,o));return yield e.post("https://content.dropboxapi.com/2/files/upload",n,{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/octet-stream","Dropbox-API-Arg":JSON.stringify({path:"/"+r,mode:"overwrite",autorename:!0,mute:!1})},maxContentLength:1/0,maxBodyLength:1/0}),!0}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token,n=t.createWriteStream(i.join(this.storagePath,r)),a=yield e({url:"https://content.dropboxapi.com/2/files/download",method:"GET",responseType:"stream",headers:{Authorization:`Bearer ${s}`,"Dropbox-API-Arg":JSON.stringify({path:"/"+o})},maxContentLength:1/0,maxBodyLength:1/0});let d=0;return a.data.on("data",(e=>{d+=e.length,this.taskQueue.setDownloadedSize(d)})),yield j(a.data,n),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class B{constructor(e){this.config=e,this.storagePath=e.storagePath,this.taskQueue=new E(1),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getClient(){return b(this,void 0,void 0,(function*(){try{if(this.client&&!1===this.client.closed)return this.client;let{url:e,username:t,password:i,dir:o,ssl:r,port:n}=this.config;const a=new s(0);a.ftp.verbose=!0;const d=a.access({host:e,port:parseInt(n),user:t,password:i,secure:"1"===r}),l=new Promise(((e,t)=>{setTimeout((()=>t(new Error("FTP connection timeout"))),5e3)}));return yield Promise.race([d,l]),this.client=a,a}catch(e){throw console.error("Error connecting to FTP server:",e),this.client=null,e}}))}uploadFile(e,t){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let{dir:o}=this.config;o=o&&"KoodoReader"===this.baseFolder?o:this.baseFolder;const r=yield this.getClient(),s=()=>b(this,void 0,void 0,(function*(){yield r.ensureDir(i.dirname(o+"/"+t)),yield r.cd("/"),yield r.uploadFrom(i.join(this.storagePath,e),o+"/"+t)}));try{return yield s(),!0}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let{dir:r}=this.config;r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder;const s=yield this.getClient(),n=t.createWriteStream(i.join(this.storagePath,o)),a=()=>b(this,void 0,void 0,(function*(){s.trackProgress((e=>{this.taskQueue.setDownloadedSize(e.bytes||0)})),yield s.downloadTo(n,r+"/"+e),s.trackProgress()}));try{return yield a(),!0}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.listFilesWithoutQueue(e)}))))))}))}listFilesWithoutQueue(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;const i=yield this.getClient(),o=()=>b(this,void 0,void 0,(function*(){return yield i.list(t+"/"+e)}));try{return(yield o()).map((e=>({name:e.name,size:e.size||0,type:e.isFile?"file":"folder",modified:e.modifiedAt?e.modifiedAt.toISOString():""})))}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;const i=yield this.getClient(),o=()=>b(this,void 0,void 0,(function*(){yield i.remove(t+"/"+e)}));try{return yield o(),!0}catch(e){return console.error(e),!1}}))}}class M{constructor(e){this.isExp=!1,this.baseUrl="https://graph.microsoft.com/v1.0/me/drive/special/approot",this.config=e,this.taskQueue=new E(3),this.isExp=this.config.isExp||!1,this.baseUrl=this.isExp?"https://graph.microsoft.com/v1.0/me/drive/root":"https://graph.microsoft.com/v1.0/me/drive/special/approot",void 0===this.config.baseFolder?this.baseFolder=this.isExp?"KoodoReader":"":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);let o,r=[];if(""===t)o=`${this.baseUrl}/children`;else{const e=encodeURIComponent(t);o=`${this.baseUrl}:/${e}:/children`}for(;o;){const t=yield e.get(o,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});if(t.status>=300)break;const s=t.data.value||[];r=r.concat(s),o=t.data["@odata.nextLink"]||""}return[...new Set(r.map((e=>({name:e.name,size:e.size||0,type:e.folder?"folder":"file",modified:e.lastModifiedDateTime}))))]}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);const o=yield e.delete(`${this.baseUrl}:/${t}`,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});return!(o.status>=300)||(console.error("Error deleting file:",o),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=${I}&scope=${this.isExp?"files.readwrite.all":"files.readwrite.appfolder"} offline_access&response_type=code&redirect_uri=${e}`}}const U=209715200;class W extends M{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){var s;let n=null;try{const s=this.config.access_token;let a=this.baseFolder+"/"+r;for(;a.startsWith("/");)a=a.substring(1);const d=i.join(this.storagePath,o),l=yield this.getFileSize(d),c=a.split(".").pop(),u=(F(c||""),`${this.baseUrl}:/${a}:/createUploadSession`),h=(yield e.post(u,{item:{"@microsoft.graph.conflictBehavior":"replace"}},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}})).data.uploadUrl;n=yield t.promises.open(d,"r");let p=0,f=Buffer.alloc(U);for(;pthis.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token;let n=this.baseFolder+"/"+o;for(;n.startsWith("/");)n=n.substring(1);const a=`${this.baseUrl}:/${n}:/content`;let d=(yield fetch(a,{headers:{Authorization:"Bearer "+s},redirect:"manual"})).headers.get("location");if(d){const o=yield e.get(d,{responseType:"stream"});let s=0;const n=t.createWriteStream(i.join(this.storagePath,r));return o.data.on("data",(e=>{s+=e.length,this.taskQueue.setDownloadedSize(s)})),yield new Promise(((e,t)=>{o.data.pipe(n),n.on("finish",(()=>{e()})),n.on("error",t)})),!0}return!1}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}class N{constructor(e){this.isExp=!1,this.folderIdCache=new Map,this.config=e,this.taskQueue=new E(3),this.isExp=this.config.isExp||!1,this.baseFolder="KoodoReader"}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getFileId(t,i){return b(this,void 0,void 0,(function*(){const o=this.config.access_token,r=`https://www.googleapis.com/drive/v3/files?q=name='${t}'+and+'${i}'+in+parents&fields=files(id,name)`;try{const t=yield e.get(r,{headers:{Authorization:"Bearer "+o}});if(0===t.data.files.length)return"";const i=t.data.files;return i.length>0?i[0].id:null}catch(e){return console.error("Error occurred during file list retrieval:",e),""}}))}checkFolder(t){return b(this,void 0,void 0,(function*(){t=this.baseFolder+"/"+t;const i=this.config.access_token;if(""===t)return"root";if(this.folderIdCache.has(t))return this.folderIdCache.get(t);const o=t.split("/").filter((e=>""!==e.trim()));let r="root",s="";for(const t of o){if(s=s?s+"/"+t:t,this.folderIdCache.has(s)){r=this.folderIdCache.get(s);continue}let o=yield this.getFolderId(t,r);if(!o){const s={name:t,mimeType:"application/vnd.google-apps.folder",parents:[r]};try{o=(yield e.post("https://www.googleapis.com/drive/v3/files",s,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.id}catch(e){throw console.error(`Error occurred during folder creation for ${t}:`,e),e}}this.folderIdCache.set(s,o),r=o}return r}))}getFolderId(t,i){return b(this,void 0,void 0,(function*(){const o=this.config.access_token,r=`https://www.googleapis.com/drive/v3/files?q=name='${t=encodeURIComponent(t)}'+and+mimeType='application/vnd.google-apps.folder'+and+'${i}'+in+parents&fields=files(id,name)`;try{const t=(yield e.get(r,{headers:{Authorization:`Bearer ${o}`}})).data.files;return t.length>0?t[0].id:null}catch(e){throw console.error("Error occurred during fetching folder ID:",e),e}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=yield this.checkFolder(t),r=[],s="",n=!0;for(;n;){let t=`https://www.googleapis.com/drive/v3/files?q='${o}'+in+parents&fields=nextPageToken,files(id,name,size,mimeType)&pageSize=1000`;s&&(t+=`&pageToken=${s}`);const a=yield e.get(t,{headers:{Authorization:`Bearer ${i}`}}),d=a.data.files||[];r=r.concat(d),s=a.data.nextPageToken,n=!!s}return[...new Set(r.map((e=>({name:e.name,size:e.size||0,type:"application/vnd.google-apps.folder"===e.mimeType?"folder":"file",modified:e.modifiedTime}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQue(e)}))))))}))}deleteFileWithoutQue(t){return b(this,void 0,void 0,(function*(){const i=t.split("/").pop()||"",o=t.split("/").slice(0,-1).join("/"),r=yield this.checkFolder(o),s=this.config.access_token,n=yield this.getFileId(i,r);if(""===n)return console.error("File not found:",i),!0;try{const t=yield e.delete(`https://www.googleapis.com/drive/v3/files/${n}`,{headers:{Authorization:`Bearer ${s}`}});return console.error("File deleted:",t),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=${e}&prompt=consent&response_type=code&client_id=${$}&scope=https://www.googleapis.com/auth/${this.isExp?"drive":"drive.file"}&access_type=offline`}}class K extends N{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token;let n=o.split("/").pop(),a=r.split(".").pop(),d=F(a||""),l=r.split("/").slice(0,-1).join("/"),c=yield this.checkFolder(l),u=yield this.getFileId(n||"",c);const h={mimeType:d,name:n,parents:[c]},p=u?`https://www.googleapis.com/upload/drive/v3/files/${u}?uploadType=resumable`:"https://www.googleapis.com/upload/drive/v3/files?uploadType=resumable",f=(yield e({method:u?"PATCH":"POST",url:p,data:u?null:JSON.stringify(h),headers:{Authorization:"Bearer "+s,"Content-Type":"application/json; charset=UTF-8"},maxContentLength:1/0,maxBodyLength:1/0})).headers.location;let g=yield this.getFileSize(i.join(this.storagePath,o));const y=t.createReadStream(i.join(this.storagePath,o));yield e.put(f,y,{headers:{Authorization:"Bearer "+s,"Content-Type":"application/zip","Content-Range":`bytes 0-${g-1}/${g}`},maxContentLength:1/0,maxBodyLength:1/0});return!0}catch(e){return console.error("Error occurred during upload:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token;let n=o.split("/").pop(),a=o.split("/").slice(0,-1).join("/"),d=yield this.checkFolder(a),l=yield this.getFileId(n||"",d);if(!l)return console.error("File not found"),!0;const c=`https://www.googleapis.com/drive/v3/files/${l}?alt=media`;return new Promise((o=>{const n=t.createWriteStream(i.join(this.storagePath,r));e({url:c,method:"GET",responseType:"stream",headers:{Authorization:"Bearer "+s},maxContentLength:1/0,maxBodyLength:1/0}).then((e=>{let t=0;e.data.on("data",(e=>{t+=e.length,this.taskQueue.setDownloadedSize(t)})),e.data.pipe(n),n.on("finish",(()=>{o(!0)})),n.on("error",(()=>{o(!1)}))})).catch((e=>{console.error("Error downloading file:",e),o(!1)}))}))}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}class H{constructor(e){this.config=e,this.taskQueue=new E(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}shouldUsePathStyle(){try{if(this.config.forcePathStyle&&"no"!==this.config.forcePathStyle)return!0;let e=this.config.endpoint;const t=new URL(e),i=t.hostname,o=/^(\d{1,3}\.){3}\d{1,3}$/.test(i),r=""!==t.port;return!o&&r}catch(e){return!0}}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:o,accessKeyId:r,secretAccessKey:s,dir:d}=this.config;d=d&&"KoodoReader"===this.baseFolder?d:this.baseFolder;let l=d+"/"+e;for(;l.startsWith("/");)l=l.substring(1);""===l||l.endsWith("/")||(l+="/");const c=new n({endpoint:t,region:i,credentials:{accessKeyId:r,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});try{let e,t=[],i=[],r=!0;for(;r;){const s=yield c.send(new a({Bucket:o,Prefix:l,Delimiter:"/",ContinuationToken:e}));s.Contents&&(t=t.concat(s.Contents)),s.CommonPrefixes&&(i=i.concat(s.CommonPrefixes)),e=s.NextContinuationToken,r=!!e}let s=[];return t.forEach((e=>{if(!e.Key.endsWith("/")){const t=e.Key.substring(l.length);t.includes("/")||s.push({name:t,size:e.Size||0,type:"file",modified:e.LastModified?e.LastModified.toISOString():""})}})),i.forEach((e=>{const t=e.Prefix.substring(l.length).replace(/\/$/,"");t&&s.push({name:t,size:0,type:"folder",modified:""})})),s}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){let{endpoint:t,region:i,bucketName:o,accessKeyId:r,secretAccessKey:s,dir:a}=this.config;a=a&&"KoodoReader"===this.baseFolder?a:this.baseFolder;const l=new n({endpoint:t,region:i,credentials:{accessKeyId:r,secretAccessKey:s},forcePathStyle:this.shouldUsePathStyle()});let c=a+"/"+e;for(;c.startsWith("/");)c=c.substring(1);try{return yield l.send(new d({Bucket:o,Key:c})),!0}catch(e){return console.error(e),!1}}))}}class q extends H{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){let{endpoint:r,region:s,bucketName:a,accessKeyId:d,secretAccessKey:c,dir:u}=this.config;const h=new n({endpoint:r,region:s,credentials:{accessKeyId:d,secretAccessKey:c},forcePathStyle:this.shouldUsePathStyle()});u=u&&"KoodoReader"===this.baseFolder?u:this.baseFolder;let p=u+"/"+o;for(;p.startsWith("/");)p=p.substring(1);try{let o=yield h.send(new l({Bucket:a,Key:p,Body:t.createReadStream(i.join(this.storagePath,e))}));return 200===o.$metadata.httpStatusCode||(console.error("Error uploading file:",o),!1)}catch(e){return console.error("Error: ",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let{endpoint:r,region:s,bucketName:a,accessKeyId:d,secretAccessKey:l,dir:u}=this.config;u=u&&"KoodoReader"===this.baseFolder?u:this.baseFolder;const h=(e,t,i,o)=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){const s=yield e.send(new c({Bucket:t,Key:i}));let n=0;s.Body?(s.Body.on("data",(e=>{n+=e.length,this.taskQueue.setDownloadedSize(n)})),s.Body.pipe(o),o.on("finish",(e=>{e&&r(!1),r(!0)}))):r(!1)})))),p=()=>new Promise(((c,p)=>{const f=new n({region:s,endpoint:r,credentials:{accessKeyId:d,secretAccessKey:l},forcePathStyle:this.shouldUsePathStyle()});let g=t.createWriteStream(i.join(this.storagePath,o)),y=u+"/"+e;for(;y.startsWith("/");)y=y.substring(1);h(f,a,y,g).then((e=>{c(!0)})).catch((e=>{console.error(e),c(!1)}))}));try{return yield p()}catch(e){return console.error(e),!1}}))))))}))}}class J{constructor(e){let{username:t,password:i,url:o,dir:r,AuthType:s,createClient:n}=e;void 0===e.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=e.baseFolder,r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder,this.username=t,this.password=i,this.url=o,this.dir=r,this.taskQueue=new E(5),this.AuthType=s,this.createClient=n}getClient(){return b(this,void 0,void 0,(function*(){return this.webdavClient||(this.url=yield this.handleUrlRedirection(this.url),this.webdavClient=this.createClient(this.url,{authType:this.AuthType.Password,username:this.username,password:this.password})),this.webdavClient}))}handleUrlRedirection(t){return b(this,void 0,void 0,(function*(){try{const i=yield e.head(t,{maxRedirects:0,validateStatus:()=>!0,timeout:5e3});return i.request&&i.request.responseURL&&i.request.responseURL!==t?i.request.responseURL:i.status>=300&&i.status<400&&i.headers.location?i.headers.location:t}catch(e){return console.info("Error handling URL redirection:",e),t}}))}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){const t=yield this.getClient();try{const i=t.getDirectoryContents(this.dir+"/"+e),o=new Promise(((e,t)=>{setTimeout((()=>t(new Error("WebDAV list directory timeout"))),5e3)}));return(yield Promise.race([i,o])).filter((t=>"."!==t.filename&&".."!==t.filename&&t.filename!==e)).map((e=>({name:e.basename,size:e.size||0,type:"directory"===e.type?"folder":"file",modified:e.lastmod})))}catch(i){return i.response&&404===i.response.status&&(yield t.createDirectory(this.dir+"/"+e)),console.error("Error listing files:",i),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){const t=yield this.getClient();try{return yield t.deleteFile(this.dir+"/"+e),!0}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(e){return b(this,void 0,void 0,(function*(){let t=yield this.getClient();try{const i=e.replace(/^\/+|\/+$/g,"").split("/").filter((e=>e.length>0));let o="";for(const e of i)o=o?`${o}/${e}`:e,(yield t.exists(`/${o}`))||(yield t.createDirectory(`/${o}`));return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}}class V extends J{constructor(e){super(Object.assign(Object.assign({},e),{AuthType:u,createClient:h})),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let s=yield this.getClient();const n=s.exists(i.dirname(this.dir+"/"+r)),a=new Promise(((e,t)=>{setTimeout((()=>t(new Error("WebDAV exists check timeout"))),5e3)}));!1===(yield Promise.race([n,a]))&&(yield this.ensureDirectoryExists(i.dirname(this.dir+"/"+r)));let d=t.readFileSync(i.join(this.storagePath,o)),l=i.extname(o).substring(1),c=F(l),u=s.createWriteStream(this.dir+"/"+r,{headers:{"content-type":c,"content-length":d.length}});return t.createReadStream(i.join(this.storagePath,o)).pipe(u),new Promise(((t,i)=>{u.on("finish",(()=>{t(!0)})),u.on("error",(i=>b(this,void 0,void 0,(function*(){console.error("Error occurred during file upload:",i);try{let i=s.getFileUploadLink(this.dir+"/"+r);const o=new URL(i);o.search="",i=o.toString();const n=Buffer.from(this.username+":"+this.password,"binary").toString("base64");yield e.put(i,d,{headers:{Authorization:"Basic "+n,"Content-Type":c,"Content-Length":d.length},maxContentLength:1/0,maxBodyLength:1/0});t(!0)}catch(e){console.error("Error occurred during file upload:",e),t(!1)}}))))}))}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){if(this.taskQueue.setDownloadedSize(0),-1===e.indexOf("."))return new ArrayBuffer(0);try{let r=yield this.getClient();if(!1===(yield r.exists(this.dir+"/"+e)))return!0;let s=0,n=t.createWriteStream(i.join(this.storagePath,o)),a=r.createReadStream(this.dir+"/"+e);return a.on("data",(e=>{s+=e.length,this.taskQueue.setDownloadedSize(s)})),a.pipe(n),new Promise(((e,t)=>{n.on("finish",(()=>{e(!0)})),n.on("error",(t=>{e(!1)}))}))}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class X{constructor(e){this.folderExistsCache=new Set,this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){var i,o;return b(this,void 0,void 0,(function*(){try{const r=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);let s=[],n=0;const a=1e3;let d=!0;for(;d;){const l=yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${r}`,"Content-Type":"application/json"},params:{path:t?`/${t}`:"/",limit:a,offset:n,fields:"_embedded.items.name,_embedded.items.size,_embedded.items.type,_embedded.items.modified,_embedded.total"}}),c=(null===(i=l.data._embedded)||void 0===i?void 0:i.items)||[];s=s.concat(c);const u=(null===(o=l.data._embedded)||void 0===o?void 0:o.total)||0;n+=c.length,d=n({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modified}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;for(t=this.baseFolder+"/"+t;t.startsWith("/");)t=t.substring(1);const o=yield e.delete("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${i}`,"Content-Type":"application/json"},params:{path:t?`/${t}`:"/",permanently:!1}});return 202===o.status||204===o.status}catch(e){return console.error("Error deleting file:",e),!1}}))}ensureDirectoryExists(t){var i,o;return b(this,void 0,void 0,(function*(){try{const r=this.config.access_token,s=t.split("/").filter((e=>e.length>0));let n="";for(const t of s)if(n+="/"+t,!this.folderExistsCache.has(n))try{yield e.get("https://cloud-api.yandex.net/v1/disk/resources",{headers:{Authorization:`OAuth ${r}`,"Content-Type":"application/json"},params:{path:n}}),this.folderExistsCache.add(n)}catch(t){if(404!==(null===(i=t.response)||void 0===i?void 0:i.status))return console.error("Error checking directory:",t),!1;try{yield e.put(`https://cloud-api.yandex.net/v1/disk/resources?path=${encodeURIComponent(n)}`,null,{headers:{Authorization:`OAuth ${r}`}}),this.folderExistsCache.add(n)}catch(e){if(409!==(null===(o=e.response)||void 0===o?void 0:o.status))return console.error("Error creating directory:",e),!1;this.folderExistsCache.add(n)}}return!0}catch(e){return console.error("Error ensuring directory exists:",e),!1}}))}getAuthUrl(e){return`https://oauth.yandex.com/authorize?response_type=code&client_id=${R}&redirect_uri=${e}&force_confirm=true`}}const Y=o(r.pipeline);class G extends X{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token;let n=this.baseFolder+"/"+r;for(;n.startsWith("/");)n=n.substring(1);const a=n.substring(0,n.lastIndexOf("/"));if(a){if(!(yield this.ensureDirectoryExists(a)))return console.error("Failed to create directory:",a),!1}const d=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/upload",{headers:{Authorization:`OAuth ${s}`,"Content-Type":"application/json"},params:{path:`/${n}`,overwrite:!0}});if(200!==d.status)return console.error("Error getting upload URL:",d),!1;const l=d.data.href,c=t.createReadStream(i.join(this.storagePath,o));return yield e.put(l,c,{headers:{"Content-Type":"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0}),!0}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);let s=this.baseFolder+"/"+o;for(;s.startsWith("/");)s=s.substring(1);try{const o=this.config.access_token,n=yield e.get("https://cloud-api.yandex.net/v1/disk/resources/download",{headers:{Authorization:`OAuth ${o}`,"Content-Type":"application/json"},params:{path:`/${s}`}});if(200!==n.status)return console.error("Error getting download URL:",n),!1;const a=n.data.href,d=t.createWriteStream(i.join(this.storagePath,r)),l=yield e({url:a,method:"GET",responseType:"stream",maxContentLength:1/0,maxBodyLength:1/0});let c=0;return l.data.on("data",(e=>{c+=e.length,this.taskQueue.setDownloadedSize(c)})),yield Y(l.data,d),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class Z{constructor(e){this.config=e,this.storagePath=e.storagePath,this.taskQueue=new E(5),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getClient(){return b(this,void 0,void 0,(function*(){try{if(this.client)return this.client;let{url:e,username:t,password:i,dir:o,port:r}=this.config;const s=new p,n=s.connect({host:e||"",port:r||22,username:t||"",password:i||""}),a=new Promise(((e,t)=>{setTimeout((()=>t(new Error("SFTP connection timeout"))),5e3)}));return yield Promise.race([n,a]),this.client=s,s}catch(e){throw console.error("Error connecting to SFTP server:",e),this.client=null,e}}))}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let{dir:r}=this.config;r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder;let s=yield this.getClient();const n=()=>new Promise(((n,a)=>b(this,void 0,void 0,(function*(){let a=t.createReadStream(i.join(this.storagePath,e)),d="/"+r+"/"+o,l="/"+r+"/"+i.dirname(o);(yield s.exists(l))||(yield s.mkdir(l,!0)),s.put(a,d).then((()=>{n(!0)})).catch((e=>{console.error(e.message),n(!1)}))}))));try{return yield n()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let{dir:r}=this.config;r=r&&"KoodoReader"===this.baseFolder?r:this.baseFolder;let s=yield this.getClient();const n=()=>new Promise(((n,a)=>b(this,void 0,void 0,(function*(){let a="/"+r+"/"+e,d=i.join(this.storagePath,o),l=t.createWriteStream(d);s.get(a,l).then((()=>{this.taskQueue.setDownloadedSize(l.bytesWritten||0),n(!0)})).catch((e=>{console.error(e.message),n(!1)}))}))));try{return yield n()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;let i=yield this.getClient();const o=()=>new Promise(((o,r)=>b(this,void 0,void 0,(function*(){let r="/"+t+"/"+e;(yield i.exists(r))||(yield i.mkdir(r,!0),o([])),i.list(r).then((e=>{o(e.map((e=>({name:e.name,size:e.size||0,type:"d"===e.type?"folder":"file",modified:e.modifyTime}))))})).catch((e=>b(this,void 0,void 0,(function*(){console.error(e.message,"list file error"),o([])}))))}))));try{return yield o()}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){let{dir:t}=this.config;t=t&&"KoodoReader"===this.baseFolder?t:this.baseFolder;let i=yield this.getClient();try{return yield new Promise(((o,r)=>{let s="/"+t+"/"+e;i.delete(s).then((()=>{o(!0)})).catch((e=>{console.error(e.message),o(!1)}))}))}catch(e){return console.error(e),!1}}))}}class ee{downloadFile(e,t){return b(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}uploadFile(e,t){return b(this,void 0,void 0,(function*(){return new Promise((e=>{e(!0)}))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return new Promise((e=>{e([])}))}))}getAuthUrl(){return""}}class te{constructor(e){this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getFolderIdByPath(t){return b(this,void 0,void 0,(function*(){if(""==t)return"0";const i=this.config.access_token,o=t.split("/");let r="0";for(const t of o){const o=`https://api.box.com/2.0/folders/${r}/items?fields=id,name&type=folder&limit=1000`;try{const s=(yield e.get(o,{headers:{Authorization:`Bearer ${i}`}})).data.entries.find((e=>e.name===t&&"folder"===e.type));if(s)r=s.id;else{const o={name:t,parent:{id:r},type:"folder"};r=(yield e.post("https://api.box.com/2.0/folders",o,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.id}}catch(e){return console.error("Error occurred during folder creation:",e),""}}return r}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=this.baseFolder+"/"+t;for(;o.startsWith("/");)o=o.substring(1);let r=yield this.getFolderIdByPath(o),s=[],n=0,a=!0;const d=1e3;for(;a;){const t=yield e.get(`https://api.box.com/2.0/folders/${r}/items`,{params:{limit:d,offset:n},headers:{Authorization:`Bearer ${i}`}}),o=t.data.entries||[];s=s.concat(o),n+=o.length,a=o.length===d&&t.data.total_count>n}return[...new Set(s.map((e=>({name:e.name,size:e.size||0,type:e.type,modified:e.content_modified_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=t.substring(0,t.lastIndexOf("/")),r=t.substring(t.lastIndexOf("/")+1);let s=this.baseFolder+"/"+o;for(;s.startsWith("/");)s=s.substring(1);const n=yield this.getFolderIdByPath(s);if(!n)return!0;const a=`https://api.box.com/2.0/folders/${n}/items?fields=id,name&type=file&limit=1000`,d=(yield e.get(a,{headers:{Authorization:`Bearer ${i}`}})).data.entries.find((e=>e.name===r&&"file"===e.type));return!d||(yield e.delete(`https://api.box.com/2.0/files/${d.id}`,{headers:{Authorization:`Bearer ${i}`}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}getAuthUrl(e){return`https://account.box.com/api/oauth2/authorize?${new URLSearchParams({response_type:"code",client_id:_,redirect_uri:e,grant_type:"authorization_code",box_subject_type:"enterprise",scope:"root_readwrite"}).toString()}`}}class ie extends te{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token,n=r.substring(0,r.lastIndexOf("/")),a=r.substring(r.lastIndexOf("/")+1);let d=this.baseFolder+"/"+n;for(;d.startsWith("/");)d=d.substring(1);const l=yield this.getFolderIdByPath(d);if(!l)throw new Error("Folder not found");const c=yield this.listFiles(n);c.find((e=>e===a))&&(yield this.deleteFileWithoutQueue(n+"/"+a));const u=new f,h=JSON.stringify({name:a,parent:{id:l}});u.append("attributes",h),u.append("file",t.createReadStream(i.join(this.storagePath,o)));const p=yield e.post("https://upload.box.com/api/2.0/files/content",u,{headers:Object.assign({Authorization:`Bearer ${s}`},u.getHeaders()),maxContentLength:1/0,maxBodyLength:1/0});return!(p.status>=300)||(console.error("Error occurred during file upload:",p),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token,n=o.substring(0,o.lastIndexOf("/")),a=o.substring(o.lastIndexOf("/")+1);let d=this.baseFolder+"/"+n;for(;d.startsWith("/");)d=d.substring(1);const l=yield this.getFolderIdByPath(d);if(!l)return console.error("Folder not found"),!0;const c=`https://api.box.com/2.0/folders/${l}/items?fields=id,name&type=file&limit=1000`,u=(yield e.get(c,{headers:{Authorization:`Bearer ${s}`}})).data.entries.find((e=>e.name===a&&"file"===e.type));if(!u)return console.error("File not found:",a),!0;const h=yield e({url:`https://api.box.com/2.0/files/${u.id}/content`,method:"get",responseType:"stream",headers:{Authorization:`Bearer ${s}`}});return yield new Promise(((e,o)=>{let s=0;const n=t.createWriteStream(i.join(this.storagePath,r));h.data.on("data",(e=>{s+=e.length,this.taskQueue.setDownloadedSize(s)})),h.data.pipe(n),n.on("finish",e),n.on("error",o)})),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class oe{constructor(e){this.folderCreationLocks=new Map,this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=2){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getStorage(){return b(this,void 0,void 0,(function*(){if(this.storage)return this.storage;let{email:e,password:t}=this.config;return this.storage=yield new g({email:e,password:t,userAgent:"KoodoReader/1.0"}).ready,this.storage}))}getRoot(){return b(this,void 0,void 0,(function*(){if(this.root)return this.root;const e=(yield this.getStorage()).root;if(""===this.baseFolder)return this.root=e,this.root;let t=e.children.find((e=>e.name===this.baseFolder&&e.directory));return t||(t=yield e.mkdir(this.baseFolder)),this.root=t,this.root}))}createFolder(e,t){return b(this,void 0,void 0,(function*(){const i=`${e.nodeId}_${t}`;if(this.folderCreationLocks.has(i))return yield this.folderCreationLocks.get(i);const o=(()=>b(this,void 0,void 0,(function*(){try{let i=e.children.find((e=>e.name===t&&e.directory));return i||(i=yield e.mkdir(t),i)}finally{this.folderCreationLocks.delete(i)}})))();return this.folderCreationLocks.set(i,o),yield o}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){try{let t=yield this.getRoot();if(e){const i=e.split("/").filter((e=>e));for(const e of i){const i=t.children.find((t=>t.name===e&&t.directory));if(!i)return[];t=i}}return t.children.map((e=>({name:e.name,size:e.size||0,type:e.directory?"folder":"file",modified:e.timestamp?new Date(1e3*e.timestamp).toISOString():""})))}catch(e){return console.error("Error listing MEGA files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(e){return b(this,void 0,void 0,(function*(){try{let t=yield this.getRoot();const i=e.split("/"),o=i.pop();for(const e of i){if(!e)continue;const i=t.children.find((t=>t.name===e&&t.directory));if(!i)return!0;t=i}const r=t.children.find((e=>e.name===o&&!e.directory));return!r||(yield r.delete(),!0)}catch(e){return console.error("Error deleting MEGA file:",e),!1}}))}}class re extends oe{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{let r=yield this.getRoot();const s=o.split("/"),n=s.pop()||"";for(const e of s){if(!e)continue;let t=r.children.find((t=>t.name===e&&t.directory));t||(t=yield this.createFolder(r,e)),r=t}const a=r.children.find((e=>e.name===n&&!e.directory));a&&(yield a.delete());const d=t.createReadStream(i.join(this.storagePath,e)),l=t.statSync(i.join(this.storagePath,e)).size;return yield r.upload({name:n,size:l},d).complete,!0}catch(e){return console.error("Error occurred during MEGA file upload:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let r=yield this.getRoot();const s=e.split("/"),n=s.pop()||"";for(const e of s){if(!e)continue;const t=r.children.find((t=>t.name===e&&t.directory));if(!t)return!0;r=t}const a=r.children.find((e=>e.name===n&&!e.directory));if(!a)return!0;const d=t.createWriteStream(i.join(this.storagePath,o));let l=0;return new Promise((e=>{const t=a.download();t.on("data",(e=>{l+=e.length,this.taskQueue.setDownloadedSize(l)})),t.pipe(d),d.on("finish",(()=>e(!0))),d.on("error",(t=>{console.error("Error writing file:",t),e(!1)}))}))}catch(e){return console.error("Error occurred during MEGA file download:",e),!1}}))))))}))}}class se{constructor(e){this.config=e,this.driveId="",this.taskQueue=new E(1),void 0===this.config.baseFolder?this.baseFolder="/KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getDriveId(){return b(this,void 0,void 0,(function*(){if(this.driveId)return this.driveId;const t=this.config.access_token,i=yield e.post("https://openapi.alipan.com/adrive/v1.0/user/getDriveInfo",{},{headers:{Authorization:`Bearer ${t}`}});return this.driveId=i.data.default_drive_id,this.driveId}))}getFolderIdByPath(t){return b(this,void 0,void 0,(function*(){const i=this.config.access_token,o=yield this.getDriveId();try{try{const r=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:t},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}});if(r.data)return r.data.file_id}catch(r){const s=t.split("/").filter((e=>e));let n="",a="root";for(const t of s){n+="/"+t;try{a=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:o,file_path:n},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.file_id}catch(r){a=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:o,parent_file_id:a,name:t,type:"folder",check_name_mode:"refuse"},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}})).data.file_id}}return a}}catch(e){return console.error("Error getting/creating folder by path:",e),""}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=yield this.getDriveId(),r=yield this.getFolderIdByPath(this.baseFolder+"/"+t);let s=[],n="",a=!0;for(;a;){const t=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/list",{drive_id:o,parent_file_id:r,marker:n||void 0},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}}),d=t.data.items.filter((e=>!e.punish_flag||2!==e.punish_flag))||[];s=s.concat(d),n=t.data.next_marker,a=!!n}return[...new Set(s.map((e=>({name:e.name,size:e.size,type:e.type,modified:e.updated_at}))))]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=yield this.getDriveId(),r=yield this.getFolderIdByPath(this.baseFolder+"/"+t);return!r||(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/delete",{drive_id:o,file_id:r},{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error deleting file:",e),!1}}))}checkExists(t){var i;return b(this,void 0,void 0,(function*(){try{const o=this.config.access_token,r=yield this.getDriveId(),s=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:r,file_path:t},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}});(null===(i=s.data)||void 0===i?void 0:i.file_id)&&(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/recyclebin/trash",{drive_id:r,file_id:s.data.file_id},{headers:{Authorization:`Bearer ${o}`,"Content-Type":"application/json"}}))}catch(e){}}))}getAuthUrl(e){return`https://openapi.alipan.com/oauth/authorize?${new URLSearchParams({response_type:"code",client_id:L,redirect_uri:e,grant_type:"authorization_code",scope:"user:base,file:all:write,file:all:read"}).toString()}`}}class ne extends se{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.access_token,n=yield this.getDriveId(),a=r.substring(0,r.lastIndexOf("/")),d=r.substring(r.lastIndexOf("/")+1);yield this.deleteFileWithoutQueue(r);const l=yield this.getFolderIdByPath(this.baseFolder+"/"+a),c=i.join(this.storagePath,o),u=yield t.promises.readFile(c),h=u.length,p=y.createHash("sha1").update(u).digest("hex"),f=y.createHash("md5").update(s).digest("hex"),g=Number(BigInt("0x"+f.slice(0,16))%BigInt(h||1)),m=u.slice(g,Math.min(g+8,h)).toString("base64"),v=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/create",{drive_id:n,parent_file_id:l,name:d,type:"file",check_name_mode:"ignore",size:h,content_hash:p,content_hash_name:"sha1",proof_code:m,proof_version:"v1",part_info_list:[{part_number:1}]},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}),{file_id:k,upload_id:b,rapid_upload:F,part_info_list:w}=v.data;return F?(console.info("阿里云盘秒传成功"),!0):(yield fetch(w[0].upload_url,{method:"PUT",body:u,headers:{"Content-Length":h.toString()}}),yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/complete",{drive_id:n,file_id:k,upload_id:b},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}),!0)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.access_token,n=yield this.getDriveId(),a=(yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/get_by_path",{drive_id:n,file_path:this.baseFolder+"/"+o},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}})).data.file_id,d=yield e.post("https://openapi.alipan.com/adrive/v1.0/openFile/getDownloadUrl",{drive_id:n,file_id:a},{headers:{Authorization:`Bearer ${s}`,"Content-Type":"application/json"}}),l=yield e({url:d.data.url,method:"get",responseType:"stream"});let c=0;const u=t.createWriteStream(i.join(this.storagePath,r+".temp"));return l.data.on("data",(e=>{c+=e.length,this.taskQueue.setDownloadedSize(c)})),l.data.pipe(u),new Promise((e=>{u.on("finish",(()=>{t.renameSync(i.join(this.storagePath,r+".temp"),i.join(this.storagePath,r)),e(!0)})),u.on("error",(t=>{console.error("Error occurred during file download:",t),e(!1)}))}))}catch(e){return console.error("Error downloading file:",e),!1}}))))))}))}}class ae{constructor(e){this.baseUrl="https://api.pcloud.com",this.config=e,this.taskQueue=new E(3),this.baseUrl="2"===e.region?"https://eapi.pcloud.com":"https://api.pcloud.com"}retryOperation(e,t=3){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}checkFolderExists(t,i){return b(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:i,path:`/${t}`}})).data.result}catch(e){return console.error("Error checking folder:",e),!1}}))}createFolder(t,i){return b(this,void 0,void 0,(function*(){try{return 0===(yield e.get(`${this.baseUrl}/createfolderifnotexists`,{params:{access_token:i,path:`/${t}`}})).data.result}catch(e){return console.error("Error creating folder:",e),!1}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/listfolder`,{params:{access_token:i,path:"/"+t,recursive:0}});return 0!==o.data.result?[]:o.data.metadata.contents.map((e=>({name:e.name,size:e.size||0,type:e.isfolder?"folder":"file",modified:e.modified})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.refresh_token,o=yield e.get(`${this.baseUrl}/deletefile`,{params:{access_token:i,path:"/"+t}});return 0===o.data.result||(console.error("Error deleting file:",o.data),!0)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getAuthUrl(e){return`https://my.pcloud.com/oauth2/authorize?client_id=${C}&response_type=code&redirect_uri=${e}`}}class de extends ae{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const s=this.config.refresh_token,n=r.split("/").slice(0,-1).join("/");if(!(yield this.checkFolderExists(n,s))){if(!(yield this.createFolder(n,s)))return!1}const a=i.join(this.storagePath,o),d=t.createReadStream(a),l=t.statSync(a),c=i.basename(o),u=yield e({method:"put",url:`${this.baseUrl}/uploadfile`,params:{access_token:s,path:`/${n}`,renew:1,filename:c},data:d,headers:{"Content-Length":l.size,"Content-Type":"application/octet-stream"},maxContentLength:1/0,maxBodyLength:1/0});return 0===u.data.result||(console.error("Error uploading file:",u.data),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=this.config.refresh_token,n=yield e.get(`${this.baseUrl}/getfilelink`,{params:{access_token:s,path:`/${o}`}});if(0!==n.data.result)return console.error("Error getting file link:",n.data),!1;const a=i.join(this.storagePath,r),d=t.createWriteStream(a),l=`https://${n.data.hosts[0]}${n.data.path}`,c=yield e({method:"get",url:l,responseType:"stream",maxContentLength:1/0,maxBodyLength:1/0});return new Promise((e=>{let t=0;c.data.on("data",(e=>{t+=e.length,this.taskQueue.setDownloadedSize(t)})),c.data.pipe(d),d.on("finish",(()=>{e(!0)})),d.on("error",(t=>{console.error("Error writing file:",t),e(!1)}))}))}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class le{constructor(e){this.config=e,this.taskQueue=new E(3),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=this.baseFolder;t&&""!==t.trim()&&(o=o+"/"+t),o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));let r=[],s=0;const n=1e3;for(;;){const t=yield e.get("https://pan.baidu.com/rest/2.0/xpan/file",{params:{method:"list",access_token:i,dir:"/"+o,start:s,limit:n,order:"name",desc:0,web:1,folder:0},headers:{"User-Agent":"pan.baidu.com"}});if(t.status>=300||0!==t.data.errno){console.error("百度网盘API错误:",t.data);break}const a=t.data.list||[];if(0===a.length)break;if(r=r.concat(a),a.length({name:e.server_filename,size:e.size||0,type:e.isdir?"folder":"file",modified:new Date(1e3*e.server_mtime).toISOString(),path:e.path,fs_id:e.fs_id})))}catch(e){return console.error("获取百度网盘文件列表时发生错误:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;let o=this.baseFolder+"/"+t;o=o.replace(/\/+/g,"/"),o.startsWith("/")&&(o=o.substring(1));const r=new URLSearchParams({async:"0",filelist:JSON.stringify(["/"+o])}),s=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=filemanager&access_token=${i}&opera=delete`,r.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==s.data.errno)return console.error("百度网盘删除文件API错误:",s.data),-9===s.data.errno?console.error("文件不存在"):111===s.data.errno?console.error("有其他异步任务正在执行"):-7===s.data.errno&&console.error("文件名非法"),!1;const n=s.data.info||[];for(const e of n)if(0!==e.errno)return console.error(`文件删除失败: ${e.path}, 错误码: ${e.errno}`),!1;return!0}catch(e){return console.error("删除文件时发生错误:",e),!1}}))}getAuthUrl(e){return`https://openapi.baidu.com/oauth/2.0/authorize?response_type=code&client_id=${P}&redirect_uri=${e}&scope=basic,netdisk&device_id=119827642&display=page&qrcode=1`}}const ce=4194304;class ue extends le{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){var s;let n=null;try{const s=this.config.access_token;let a=this.baseFolder+"/"+r;a=a.replace(/\/+/g,"/"),a.startsWith("/")&&(a=a.substring(1));const d=i.join(this.storagePath,o),l=yield this.getFileSize(d),{contentMd5:c,sliceMd5:u,blockList:h}=yield this.calculateFileMd5(d,l),p=new URLSearchParams({path:"/"+a,size:l.toString(),isdir:"0",autoinit:"1",rtype:"3",block_list:JSON.stringify(h),"content-md5":c,"slice-md5":u,local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),g=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=precreate&access_token=${s}`,p.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});if(0!==g.data.errno)return console.error("预上传失败:",g.data),-7===g.data.errno?console.error("文件或目录名错误或无权访问"):-10===g.data.errno&&console.error("容量不足"),!1;const y=g.data.uploadid,m=g.data.block_list||[];if(0===m.length)return!0;const v=yield this.getUploadDomain(s,"/"+a,y);if(!v)return console.error("获取上传域名失败"),!1;n=yield t.promises.open(d,"r");for(const t of m){const i=t*ce,o=Math.min(ce,l-i),r=Buffer.alloc(o),{bytesRead:d}=yield n.read(r,0,o,i);if(0===d)break;const c=r.slice(0,d),u=h[t],p=new f;p.append("file",c,{filename:`chunk_${t}`,contentType:"application/octet-stream",knownLength:c.length});const g=`${v}/rest/2.0/pcs/superfile2?method=upload&access_token=${s}&type=tmpfile&path=${encodeURIComponent("/"+a)}&uploadid=${y}&partseq=${t}`,m=yield e.post(g,p,{headers:Object.assign(Object.assign({"User-Agent":"pan.baidu.com"},p.getHeaders()),{"Content-Length":p.getLengthSync().toString()}),maxContentLength:1/0,maxBodyLength:1/0,timeout:0});if(m.status>=300)throw 31024===m.data.errno?console.error("没有申请上传权限"):31299===m.data.errno?console.error("第一个分片的大小小于4MB"):31364===m.data.errno?console.error("超出分片大小限制"):31363===m.data.errno&&console.error("分片缺失"),new Error(`分片上传失败: ${JSON.stringify(m.data)}`);const k=m.data.md5;k&&k!==u&&console.warn(`分片 ${t} MD5不匹配: 期望 ${u}, 实际 ${k}`)}const k=new URLSearchParams({path:"/"+a,size:l.toString(),isdir:"0",block_list:JSON.stringify(h),uploadid:y,rtype:"3",local_ctime:Math.floor(Date.now()/1e3).toString(),local_mtime:Math.floor(Date.now()/1e3).toString()}),b=yield e.post(`https://pan.baidu.com/rest/2.0/xpan/file?method=create&access_token=${s}`,k.toString(),{headers:{"Content-Type":"application/x-www-form-urlencoded","User-Agent":"pan.baidu.com"}});return 0===b.data.errno||(console.error("创建文件失败:",b.data),-7===b.data.errno?console.error("文件或目录名错误或无权访问"):-8===b.data.errno?console.error("文件或目录已存在"):-10===b.data.errno?console.error("云端容量已满"):10===b.data.errno?console.error("创建文件失败,一般是分片问题"):31190===b.data.errno?console.error("文件不存在,一般是分片上传阶段有问题"):31355===b.data.errno?console.error("参数异常,一般是uploadid参数传的有问题"):31365===b.data.errno&&console.error("文件总大小超限"),!1)}catch(e){return console.error("文件上传过程中发生错误:",(null===(s=e.response)||void 0===s?void 0:s.data)||e.message||e),!1}finally{n&&(yield n.close())}}))))))}))}getUploadDomain(t,i,o){return b(this,void 0,void 0,(function*(){try{const r=yield e.get("https://d.pcs.baidu.com/rest/2.0/pcs/file",{params:{method:"locateupload",appid:"250528",access_token:t,path:i,uploadid:o,upload_version:"2.0"},headers:{"User-Agent":"pan.baidu.com"}});if(0!==r.data.error_code)return console.error("获取上传域名失败:",r.data),null;const s=r.data.servers||[],n=s.find((e=>e.server.startsWith("https://")));return n?n.server:s.length>0?s[0].server:(console.error("没有可用的上传服务器"),null)}catch(e){return console.error("获取上传域名时出错:",e),null}}))}calculateFileMd5(e,i){return b(this,void 0,void 0,(function*(){const o=yield t.promises.open(e,"r");try{const e=y.createHash("md5"),t=[];let r="",s=0;for(;sthis.retryOperation((()=>b(this,void 0,void 0,(function*(){var s;this.taskQueue.setDownloadedSize(0);try{const n=this.config.access_token;let a,d=this.baseFolder+"/"+o;d=d.replace(/\/+/g,"/"),d.startsWith("/")&&(d=d.substring(1));let l=yield this.listFileInfos(o.substring(0,o.lastIndexOf("/")));const c=d.split("/").pop(),u=l.find((e=>e.name===c));if(!u)return console.error("文件不存在:",o),!1;const h=yield e.get("https://pan.baidu.com/rest/2.0/xpan/multimedia",{params:{method:"filemetas",access_token:n,fsids:JSON.stringify([u.fs_id]),dlink:1},headers:{"User-Agent":"pan.baidu.com"}});if(0!==h.data.errno||!(null===(s=h.data.list)||void 0===s?void 0:s[0]))return console.error("获取下载链接失败:",h.data),!1;a=h.data.list[0];const p=a.dlink,f=yield e.get(p,{responseType:"stream",params:{access_token:n},headers:{"User-Agent":"pan.baidu.com"}});let g=0;const y=t.createWriteStream(i.join(this.storagePath,r));f.data.on("data",(e=>{g+=e.length,this.taskQueue.setDownloadedSize(g)})),yield new Promise(((e,t)=>{f.data.pipe(y),y.on("finish",(()=>{e()})),y.on("error",t)}));return(yield this.getFileSize(i.join(this.storagePath,r)))===a.size||(console.error("Downloaded file size does not match expected size."),yield t.promises.unlink(i.join(this.storagePath,r)),!1)}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}class he{constructor(e){this.username=e.username,this.password=e.password,this.url=e.url,this.taskQueue=new E(3)}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{return(yield e.get(`${this.url}/list`,{params:{dir:t},auth:{username:this.username,password:this.password}})).data.files.map((e=>({name:e.name,size:e.size||0,type:"file"===e.type?"file":"folder",modified:e.modifiedTime})))||[]}catch(e){return console.error("Error listing files:",e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{return(yield e.delete(`${this.url}/delete`,{params:{dir:t.split("/").slice(0,-1).join("/")||"",filename:t.split("/").pop()},auth:{username:this.username,password:this.password}})).data.success}catch(e){return console.error("Error deleting file:",e),!1}}))}}const pe=o(r.pipeline);class fe extends he{constructor(e){super(e),this.storagePath=e.storagePath}getAuthHeader(){return`Basic ${btoa(`${this.username}:${this.password}`)}`}uploadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{r.split("/").pop();const s=r.substring(0,r.lastIndexOf("/"))||"";let n=this.listFiles("");const a=new Promise(((e,t)=>{setTimeout((()=>t(new Error("Docker connection timeout"))),5e3)}));yield Promise.race([n,a]);const d=t.createReadStream(i.join(this.storagePath,o)),l=new f;l.append("file",d);const c=yield e.post(`${this.url}/upload?dir=${encodeURIComponent(s)}`,l,{headers:Object.assign(Object.assign({},l.getHeaders()),{Authorization:this.getAuthHeader()}),maxContentLength:1/0,maxBodyLength:1/0});return!(c.status>=300)||(console.error("Error occurred during file upload:",c),!1)}catch(e){return console.error("Error uploading file:",e),!1}}))))))}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const s=o.split("/").pop()||"",n=o.substring(0,o.lastIndexOf("/"))||"",a=t.createWriteStream(i.join(this.storagePath,r)),d=yield e({url:`${this.url}/download`,method:"GET",params:{dir:n,filename:s},headers:{Authorization:this.getAuthHeader()},maxContentLength:1/0,maxBodyLength:1/0,responseType:"stream"});if(d.status>=300)return console.error("Error occurred during file download:",d),a.destroy(),t.existsSync(i.join(this.storagePath,r))&&t.unlinkSync(i.join(this.storagePath,r)),!1;let l=0;return d.data.on("data",(e=>{l+=e.length,this.taskQueue.setDownloadedSize(l)})),yield pe(d.data,a),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}}class ge{constructor(e){this.baseUrl="https://proapi.115.com",this.config=e,this.taskQueue=new E(1),void 0===this.config.baseFolder?this.baseFolder="KoodoReader":this.baseFolder=this.config.baseFolder}retryOperation(e,t=1){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}getUploadCredentials(t){return b(this,void 0,void 0,(function*(){try{const i=yield e.get(`${this.baseUrl}/open/upload/get_token`,{headers:{Authorization:`Bearer ${t}`}});return i.status>=300||!i.data.state?(console.error("Error getting upload credentials:",i.data),null):i.data.data}catch(e){return console.error("Error occurred during get upload credentials:",e),null}}))}generateOSSPolicy(e,t,i=new Date(Date.now()+36e5)){const o={expiration:i.toISOString(),conditions:[{bucket:e},{key:t},["starts-with","$success_action_status","2"],["content-length-range",0,1073741824]]};return JSON.stringify(o)}getAuthUrl(e){return`https://passportapi.115.com/open/authorize?client_id=${A}&response_type=code&redirect_uri=${e}`}}class ye extends ge{constructor(e){super(e),this.storagePath=e.storagePath}uploadFile(e,t){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){var o;try{const o=this.config.access_token;let r=this.baseFolder+"/"+t;r.startsWith("/")||(r="/"+r);let s=i.dirname(r),n=yield this.getFolderInfo(s,!0),a="0";if(n)a=n.file_id;else{let e=yield this.createFolder(s);if(!e)return console.error("Failed to create folder:",s),!1;a=e}const d=i.join(this.storagePath,e),l=yield this.getFileSize(d),c=yield this.calculateFileSha1(d),u=yield this.calculatePreSha1(d),h=i.basename(t);yield this.deleteFileWithoutQueue(t);let p=yield this.initializeUpload(a,h,l,c,u,o);if(!p)return console.error("Failed to initialize upload"),!1;if((6===p.status||7===p.status||8===p.status)&&(p=yield this.handleSecondAuth(a,p,d,h,l,c,u,o),!p))return console.error("Second authentication failed"),!1;if(2===p.status)return console.info(`File ${e} uploaded successfully via instant upload.`),!0;const f=yield this.getUploadCredentials(o);if(!f)return console.error("Failed to get upload credentials"),!1;return(yield this.uploadToObjectStorage(d,p,f))?(console.info(`File ${e} uploaded successfully.`),!0):(console.error("Failed to upload to object storage"),!1)}catch(e){return console.error("Error occurred during file upload:",(null===(o=e.response)||void 0===o?void 0:o.data)||e.message||e),!1}}))))))}))}calculateFileSha1(e){return b(this,void 0,void 0,(function*(){return new Promise(((i,o)=>{const r=y.createHash("sha1"),s=t.createReadStream(e);s.on("data",(e=>{r.update(e)})),s.on("end",(()=>{i(r.digest("hex"))})),s.on("error",(e=>{o(e)}))}))}))}calculatePreSha1(e){return b(this,void 0,void 0,(function*(){return new Promise(((i,o)=>{const r=y.createHash("sha1"),s=t.createReadStream(e,{start:0,end:131071});s.on("data",(e=>{r.update(e)})),s.on("end",(()=>{i(r.digest("hex"))})),s.on("error",(e=>{o(e)}))}))}))}handleSecondAuth(e,i,o,r,s,n,a,d){return b(this,void 0,void 0,(function*(){try{if(!i.sign_check)return console.error("No sign_check provided for second authentication"),null;const[l,c]=i.sign_check.split("-"),u=parseInt(l),h=parseInt(c),p=Buffer.alloc(h-u+1),f=yield t.promises.open(o,"r");try{yield f.read(p,0,p.length,u);const t=y.createHash("sha1");t.update(p);const o=t.digest("hex").toUpperCase();return yield this.initializeUpload(e,r,s,n,a,d,i.sign_key,o,i.pick_code)}finally{yield f.close()}}catch(e){return console.error("Error during second authentication:",e),null}}))}calculateOSSSignature(e,t){const i=Buffer.from(t).toString("base64");return y.createHmac("sha1",e).update(i).digest("base64")}uploadToObjectStorage(o,r,s){var n;return b(this,void 0,void 0,(function*(){try{const n=s.endpoint,a=r.bucket,d=r.object;let l;if(n.includes(a))l=n;else{l=`https://${a}.${n.replace(/^https?:\/\//,"")}`}const c=this.generateOSSPolicy(a,d),u=this.calculateOSSSignature(s.AccessKeySecret,c),h=Buffer.from(c).toString("base64"),p=new f;if(p.append("key",d),p.append("policy",h),p.append("OSSAccessKeyId",s.AccessKeyId),p.append("signature",u),p.append("x-oss-security-token",s.SecurityToken),p.append("success_action_status","200"),r.callback&&r.callback.callback){const e=Buffer.from(r.callback.callback).toString("base64");if(p.append("callback",e),r.callback.callback_var){const e=JSON.parse(r.callback.callback_var);for(const[t,i]of Object.entries(e))p.append(t,String(i))}}const g=t.createReadStream(o);p.append("file",g,i.basename(o));const y=yield e.post(l,p,{headers:Object.assign({},p.getHeaders()),maxContentLength:1/0,maxBodyLength:1/0});return 200===y.status||204===y.status||(console.error("Upload failed with status:",y.status),!1)}catch(e){return console.error("Error uploading file via REST API:",(null===(n=e.response)||void 0===n?void 0:n.data)||e.message||e),!1}}))}downloadFile(o,r){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{let s=this.baseFolder+"/"+o;s=s.replace(/\/+/g,"/"),s.startsWith("/")||(s="/"+s);const n=yield this.getFolderInfo(s,!1);if(!n||!n.pick_code)return console.error("Failed to get file info or pick_code for:",o),!1;const a=yield this.getFileDownloadUrl(n.pick_code);if(!a)return console.error("Failed to get download URL for:",o),!1;const d=yield e.get(a.url,{responseType:"stream"});let l=0;const c=t.createWriteStream(i.join(this.storagePath,r));return d.data.on("data",(e=>{l+=e.length,this.taskQueue.setDownloadedSize(l)})),yield new Promise(((e,t)=>{d.data.pipe(c),c.on("finish",(()=>{e()})),c.on("error",t)})),!0}catch(e){return console.error("Error occurred during file download:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;(t=this.baseFolder+"/"+t).startsWith("/")||(t="/"+t);let o=[],r=0;const s=1150;let n=!0,a=yield this.getFolderInfo(t,!0),d="";if(a)d=a.file_id;else{let e=yield this.createFolder(t);if(!e)return console.error("Failed to create folder:",t),[];d=e}if(!d)return console.error("Failed to get or create folder ID:",t),[];let l=d;for(;n;){const t={offset:r,limit:s,cur:1,show_dir:1};l&&(t.cid=l);const a=yield e.get(`${this.baseUrl}/open/ufile/files`,{headers:{Authorization:`Bearer ${i}`,"Content-Type":"application/json"},params:t});if(a.status>=300)break;const d=a.data.data||[];o=o.concat(d),d.length({name:e.fn,size:e.fs||0,type:"0"===e.fc?"folder":"file",modified:new Date(1e3*e.upt).toISOString()})))}catch(e){return console.error("Error occurred during file list:",e),[]}}))}getFileDownloadUrl(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=new f;o.append("pick_code",t);const r=yield e.post(`${this.baseUrl}/open/ufile/downurl`,o,{headers:Object.assign({Authorization:`Bearer ${i}`},o.getHeaders())});if(r.status>=300)return console.error("Error getting download URL:",r.data),null;const s=r.data.data,n=Object.keys(s)[0];return n&&s[n]?s[n].url:(console.error("No file data found in download URL response"),null)}catch(e){return console.error("Error occurred during get download URL:",e),null}}))}initializeUpload(t,i,o,r,s,n,a,d,l){return b(this,void 0,void 0,(function*(){try{const c=new f;c.append("file_name",i),c.append("file_size",o.toString()),t?c.append("target","U_1_"+t):c.append("target","U_1_0"),c.append("fileid",r),c.append("preid",s),c.append("topupload","0"),l&&c.append("pick_code",l),a&&c.append("sign_key",a),d&&c.append("sign_val",d);const u=yield e.post(`${this.baseUrl}/open/upload/init`,c,{headers:Object.assign({Authorization:`Bearer ${n}`},c.getHeaders())});return u.status>=300||!u.data.state?(console.error("Error initializing upload:",u.data),null):u.data.data}catch(e){return console.error("Error occurred during upload initialization:",e),null}}))}createFolder(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token,o=t.replace(/^\/+|\/+$/g,"");if(!o)return"";const r=o.split("/");let s="",n="0";for(const t of r){s=s?`${s}/${t}`:t;const o=yield this.getFolderInfo(s,!0);if(o&&o.file_id)n=o.file_id;else{const o=new f;o.append("pid",n),o.append("file_name",t);const r=yield e.post(`${this.baseUrl}/open/folder/add`,o,{headers:Object.assign({Authorization:`Bearer ${i}`},o.getHeaders())});if(r.status>=300||!r.data.state)return console.error("Error creating folder:",r.data),"";n=r.data.data.file_id}}return n}catch(e){return console.error("Error occurred during folder creation:",e),""}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){return yield this.deleteFileWithoutQueue(e)}))))))}))}deleteFileWithoutQueue(t){return b(this,void 0,void 0,(function*(){try{const i=this.config.access_token;t=this.baseFolder+"/"+t;let o=yield this.getFolderInfo(t,!1);if(!o)return!0;let r=new f;r.append("file_ids",o.file_id);const s=yield e.post(`${this.baseUrl}/open/ufile/delete`,r,{headers:Object.assign({Authorization:`Bearer ${i}`},r.getHeaders())});return!(s.status>=300||!s.data.state)||(console.error("Error deleting file:",s),!1)}catch(e){return console.error("Error occurred during file delete:",e),!1}}))}getFolderInfo(t,i){return b(this,void 0,void 0,(function*(){if(""===t||"/"===t)return{file_id:"0"};t.startsWith("/")||(t="/"+t);try{const i=this.config.access_token;let o=new f;o.append("path",t);const r=yield e.post(`${this.baseUrl}/open/folder/get_info`,o,{headers:Object.assign(Object.assign({},o.getHeaders()),{Authorization:`Bearer ${i}`})});return r.status>=300||!r.data.state||0===r.data.data.length?(console.error("Error getting file info:",r.data),null):r.data.data}catch(e){return console.error("Error occurred during get file info:",e),null}}))}getFileSize(e){return b(this,void 0,void 0,(function*(){try{return(yield t.promises.stat(e)).size}catch(e){throw e}}))}}const me=()=>{let e="";if("darwin"===process.platform){const o=i.join(m.homedir(),"Library","Mobile Documents","iCloud~com~koodoreader~expo","Documents");t.existsSync(o)&&(e=o)}return e&&t.existsSync(e)&&t.existsSync(e)?e:""};class ve{constructor(e){this.config=e,this.storagePath=e.storagePath,this.taskQueue=new E(5)}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){let s=me();if(!s)return console.error("iCloud Drive path not found"),void r(!1);let n=s+"/"+o,a=s+"/"+i.dirname(o);t.existsSync(a)||t.mkdirSync(a,{recursive:!0}),t.existsSync(n)&&t.unlinkSync(n),t.copyFile(i.join(this.storagePath,e),n,(e=>{e?(console.error("Error uploading file:",e),r(!1)):r(!0)}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){let s=me();if(!s)return console.error("iCloud Drive path not found"),void r(!1);let n=s+"/"+e,a=i.join(this.storagePath,o);if(!t.existsSync(n))return console.error("File does not exist in iCloud:",e),void r(!1);t.existsSync(a)&&t.unlinkSync(a),t.copyFile(n,a,(e=>{if(e)console.error("Error downloading file:",e),r(!1);else{let e=t.statSync(a);this.taskQueue.setDownloadedSize(e.size),r(!0)}}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){const o=()=>new Promise(((o,r)=>b(this,void 0,void 0,(function*(){let r=me();if(!r)return console.error("iCloud Drive path not found"),void o([]);let s=r+"/"+e;t.existsSync(s)||t.mkdirSync(s,{recursive:!0}),t.readdir(s,{withFileTypes:!0},((e,r)=>{if(e)return console.error("Error reading directory:",e),void o([]);let n=r.map((e=>{let o=i.join(s,e.name),r=t.statSync(o);return{name:e.name,size:r.size,type:e.isDirectory()?"folder":"file",modified:r.mtime.toISOString()}}));o(n)}))}))));try{return yield o()}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){try{return yield new Promise(((i,o)=>{let r=me();if(!r)return console.error("iCloud Drive path not found"),void i(!1);let s=r+"/"+e;t.unlink(s,(e=>{e?(console.error("Error deleting file:",e),i(!1)):i(!0)}))}))}catch(e){return console.error(e),!1}}))}}class ke{constructor(e){this.config=e,this.storagePath=e.storagePath,this.drivePath=e.drivePath,this.taskQueue=new E(5)}retryOperation(e,t=0){return b(this,void 0,void 0,(function*(){let i=0;for(;;){const o=yield e();if(o)return o;if(i>=t)return this.taskQueue.hasFailedTasks=!0,o;i++;const r=1e3*Math.pow(2,i);console.info(`Retry attempt ${i} after ${r}ms`),yield new Promise((e=>setTimeout(e,r)))}}))}uploadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void r(!1);let s=this.drivePath+"/"+o,n=this.drivePath+"/"+i.dirname(o);t.existsSync(n)||t.mkdirSync(n,{recursive:!0}),t.existsSync(s)&&t.unlinkSync(s),t.copyFile(i.join(this.storagePath,e),s,(e=>{e?(console.error("Error uploading file:",e),r(!1)):r(!0)}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in uploadFile:",e),!1}}))))))}))}downloadFile(e,o){return b(this,void 0,void 0,(function*(){return this.taskQueue.addTask((()=>this.retryOperation((()=>b(this,void 0,void 0,(function*(){this.taskQueue.setDownloadedSize(0);try{const r=()=>new Promise(((r,s)=>b(this,void 0,void 0,(function*(){if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void r(!1);let s=this.drivePath+"/"+e,n=i.join(this.storagePath,o);if(!t.existsSync(s))return console.error("File does not exist in path:",e),void r(!1);t.existsSync(n)&&t.unlinkSync(n),t.copyFile(s,n,(e=>{if(e)console.error("Error downloading file:",e),r(!1);else{let e=t.statSync(n);this.taskQueue.setDownloadedSize(e.size),r(!0)}}))}))));try{return yield r()}catch(e){return console.error(e),!1}}catch(e){return console.error("Error in downloadFile:",e),!1}}))))))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return(yield this.listFileInfos(e)).map((e=>e.name))}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){const o=()=>new Promise(((o,r)=>b(this,void 0,void 0,(function*(){if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void o([]);let r=this.drivePath+"/"+e;t.existsSync(r)||t.mkdirSync(r,{recursive:!0}),t.readdir(r,{withFileTypes:!0},((e,s)=>{if(e)return console.error("Error reading directory:",e),void o([]);let n=s.map((e=>{let o=i.join(r,e.name),s=t.statSync(o);return{name:e.name,size:s.size,type:e.isDirectory()?"folder":"file",modified:s.mtime.toISOString()}}));o(n)}))}))));try{return yield o()}catch(e){return console.error(e),[]}}))}deleteFile(e){return b(this,void 0,void 0,(function*(){const i=()=>new Promise(((i,o)=>{if(!this.drivePath||!t.existsSync(this.drivePath))return console.error("Drive path not found"),void i(!1);let r=this.drivePath+"/"+e;t.unlink(r,(e=>{e?(console.error("Error deleting file:",e),i(!1)):i(!0)}))}));try{return yield i()}catch(e){return console.error(e),!1}}))}}const be=["book","config","cover","font"];class Fe{constructor(e,t){this.type=e,this.storagePath=t.storagePath,this.remote="dropbox"===e?new D(t):"microsoft"===e?new W(t):"google"===e?new K(t):"microsoft_exp"===e?new W(Object.assign(Object.assign({},t),{isExp:!0})):"google_exp"===e?new K(Object.assign(Object.assign({},t),{isExp:!0})):"s3compatible"===e?new q(t):"webdav"===e?new V(t):"docker"===e?new fe(t):"ftp"===e?new B(t):"sftp"===e?new Z(t):"boxnet"===e?new ie(t):"mega"===e?new re(t):"adrive"===e?new ne(t):"pcloud"===e?new de(t):"dubox"===e?new ue(t):"yandex"===e?new G(t):"yiyiwu"===e?new ye(t):"icloud"===e?new ve(t):"folder"===e?new ke(t):new ee}downloadFile(e,o,r){return b(this,void 0,void 0,(function*(){if(t.existsSync(i.join(this.storagePath+"/"+r))||t.mkdirSync(i.join(this.storagePath+"/"+r)),"cover"!==r){if(!(yield this.listFiles(r)).find((t=>e.indexOf(t)>-1)))return!1}return yield this.remote.downloadFile(r+"/"+e,r+"/"+o)}))}uploadFile(e,o,r){return b(this,void 0,void 0,(function*(){const s=i.join(this.storagePath,r,e);return!(!t.existsSync(s)||0!==t.statSync(s).size)||(yield this.remote.uploadFile(r+"/"+e,r+"/"+o))}))}deleteFile(e,t){return b(this,void 0,void 0,(function*(){return!!(yield this.listFiles(t)).find((t=>e.indexOf(t)>-1))&&(yield this.remote.deleteFile(t+"/"+e))}))}isExist(e,t){return b(this,void 0,void 0,(function*(){return(yield this.listFiles(t)).find((t=>-1!==t.indexOf(e)))}))}listFiles(e){return b(this,void 0,void 0,(function*(){return yield this.remote.listFiles(e)}))}listFileInfos(e){return b(this,void 0,void 0,(function*(){return yield this.remote.listFileInfos(e)}))}downloadAllFiles(){return b(this,void 0,void 0,(function*(){for(let e of be){let t=yield this.listFiles(e);for(let i of t)yield this.downloadFile(i,i,e)}}))}getAuthUrl(e){return this.remote.getAuthUrl(e)}getStats(){return this.remote.taskQueue.getStats()}clearQueue(){return this.remote.taskQueue.clearQueue()}resetCounters(){this.remote.taskQueue.resetCounters()}getDownloadedSize(){return this.remote.taskQueue.getDownloadedSize()}}const we={words:['ALTER TABLE words ADD COLUMN "sentence" text']},Ee={notes:"SELECT * FROM notes WHERE key = ?",bookmarks:"SELECT * FROM bookmarks WHERE key = ?",books:"SELECT * FROM books WHERE key = ?",plugins:"SELECT * FROM plugins WHERE key = ?",words:"SELECT * FROM words WHERE key = ?"},Se={notes:"SELECT * FROM notes WHERE bookKey = ?",bookmarks:"SELECT * FROM bookmarks WHERE bookKey = ?",words:"SELECT * FROM words WHERE bookKey = ?",books:"SELECT * FROM books WHERE key = ?"},Te={notes:"DELETE FROM notes WHERE bookKey = ?",bookmarks:"DELETE FROM bookmarks WHERE bookKey = ?",words:"DELETE FROM words WHERE bookKey = ?"};function Oe(e){for(const t in e)e.hasOwnProperty(t)&&(e[`temp-${t}`]=e[t]);return e}const xe={notes:e=>{let t=Object.assign({},e);return t.date=JSON.parse(e.date),t.tag=JSON.parse(e.tag),t},bookmarks:e=>e,books:e=>e,plugins:e=>{let t=Object.assign({},e);return e.autoValue||delete t.autoValue,e.langList?t.langList=JSON.parse(e.langList):delete t.langList,e.voiceList?t.voiceList=JSON.parse(e.voiceList):delete t.voiceList,t.config=JSON.parse(e.config),t},words:e=>{let t=Object.assign({},e);return t.date=JSON.parse(e.date),void 0===t.sentence&&(t.sentence=""),t}};var Re={sqlStatement:{createTableStatement:Oe({notes:'\n CREATE TABLE IF NOT EXISTS "notes" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "chapter" text,\n "chapterIndex" integer,\n "text" text,\n "cfi" text,\n "range" text,\n "notes" text,\n "percentage" text,\n "color" integer,\n "tag" array\n )\n ',bookmarks:'\n CREATE TABLE IF NOT EXISTS "bookmarks" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "cfi" text,\n "label" text,\n "percentage" text,\n "chapter" text\n );\n ',books:'\n CREATE TABLE IF NOT EXISTS "books" (\n "key" text PRIMARY KEY,\n "name" text,\n "author" text,\n "description" text,\n "md5" text,\n "cover" text,\n "format" text,\n "publisher" text,\n "size" integer,\n "page" integer,\n "path" text,\n "charset" text\n );\n ',plugins:'\n CREATE TABLE IF NOT EXISTS "plugins" (\n "key" text PRIMARY KEY,\n "type" text,\n "displayName" text,\n "icon" text,\n "version" text,\n "config" object,\n "autoValue" string,\n "langList" text,\n "voiceList" text,\n "scriptSHA256" text,\n "script" text\n );\n ',words:'\n CREATE TABLE IF NOT EXISTS "words" (\n "key" text PRIMARY KEY,\n "bookKey" text,\n "date" object,\n "word" text,\n "sentence" text,\n "chapter" text\n );\n '}),migrateStatement:Oe(we),getAllStatement:Oe({notes:"SELECT * FROM notes",bookmarks:"SELECT * FROM bookmarks",books:"SELECT * FROM books",plugins:"SELECT * FROM plugins",words:"SELECT * FROM words"}),getPagedStatement:Oe({notes:"SELECT * FROM notes LIMIT ? OFFSET ?",bookmarks:"SELECT * FROM bookmarks LIMIT ? OFFSET ?",books:"SELECT * FROM books LIMIT ? OFFSET ?",plugins:"SELECT * FROM plugins LIMIT ? OFFSET ?",words:"SELECT * FROM words LIMIT ? OFFSET ?"}),getCountStatement:Oe({notes:"SELECT COUNT(*) as count FROM notes",bookmarks:"SELECT COUNT(*) as count FROM bookmarks",books:"SELECT COUNT(*) as count FROM books",plugins:"SELECT COUNT(*) as count FROM plugins",words:"SELECT COUNT(*) as count FROM words"}),saveStatement:Oe({notes:"INSERT OR REPLACE INTO notes (key, bookKey, chapter, chapterIndex, text, cfi, range, notes, date, percentage, color, tag) VALUES (@key, @bookKey, @chapter, @chapterIndex, @text, @cfi, @range, @notes, @date, @percentage, @color, @tag)",bookmarks:"INSERT OR REPLACE INTO bookmarks (key, bookKey, cfi, label, percentage, chapter) VALUES (@key, @bookKey, @cfi, @label, @percentage, @chapter)",books:"INSERT OR REPLACE INTO books (key, name, author, description, md5, cover, format, publisher, size, page, path, charset) VALUES (@key, @name, @author, @description, @md5, @cover, @format, @publisher, @size, @page, @path, @charset)",plugins:"INSERT OR REPLACE INTO plugins (key, type, displayName, icon, version, config, autoValue, langList, voiceList, scriptSHA256, script) VALUES (@key, @type, @displayName, @icon, @version, @config, @autoValue, @langList, @voiceList, @scriptSHA256, @script)",words:"INSERT OR REPLACE INTO words (key, bookKey, date, word, sentence, chapter) VALUES (@key, @bookKey, @date, @word, @sentence, @chapter)"}),deleteAllStatement:Oe({notes:"DELETE FROM notes",bookmarks:"DELETE FROM bookmarks",books:"DELETE FROM books",plugins:"DELETE FROM plugins",words:"DELETE FROM words"}),updateStatement:Oe({notes:"UPDATE notes SET bookKey = @bookKey, chapter = @chapter, chapterIndex = @chapterIndex, text = @text, cfi = @cfi, range = @range, notes = @notes, date = @date, percentage = @percentage, color = @color, tag = @tag WHERE key = @key",bookmarks:"UPDATE bookmarks SET bookKey = @bookKey, cfi = @cfi, label = @label, percentage = @percentage, chapter = @chapter WHERE key = @key",books:"UPDATE books SET name = @name, author = @author, description = @description, md5 = @md5, cover = @cover, format = @format, publisher = @publisher, size = @size, page = @page, path = @path, charset = @charset WHERE key = @key",plugins:"UPDATE plugins SET type = @type, displayName = @displayName, icon = @icon, version = @version, config = @config, autoValue = @autoValue, langList = @langList, voiceList = @voiceList, scriptSHA256 = @scriptSHA256, script = @script WHERE key = @key",words:"UPDATE words SET bookKey = @bookKey, date = @date, word = @word, sentence = @sentence, chapter = @chapter WHERE key = @key"}),deleteStatement:Oe({notes:"DELETE FROM notes WHERE key = ?",bookmarks:"DELETE FROM bookmarks WHERE key = ?",books:"DELETE FROM books WHERE key = ?",plugins:"DELETE FROM plugins WHERE key = ?",words:"DELETE FROM words WHERE key = ?"}),dropStatement:Oe({notes:"DROP TABLE IF EXISTS notes",bookmarks:"DROP TABLE IF EXISTS bookmarks",books:"DROP TABLE IF EXISTS books",plugins:"DROP TABLE IF EXISTS plugins",words:"DROP TABLE IF EXISTS words"}),getStatement:Oe(Ee),getByBookKeyStatement:Oe(Se),getByBookKeysStatement:Oe({notes:e=>`SELECT * FROM notes WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,bookmarks:e=>`SELECT * FROM bookmarks WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,words:e=>`SELECT * FROM words WHERE bookKey IN (${e.map((()=>"?")).join(",")})`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")})`}),getKeysStatement:Oe({notes:"SELECT key FROM notes",bookmarks:"SELECT key FROM bookmarks",books:"SELECT key FROM books",plugins:"SELECT key FROM plugins",words:"SELECT key FROM words"}),getWithSortAndPageStatement:Oe({notes:(e,t,i,o)=>`SELECT * FROM notes ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,bookmarks:(e,t,i,o)=>`SELECT * FROM bookmarks ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,books:(e,t,i,o)=>`SELECT * FROM books ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,plugins:(e,t,i,o)=>`SELECT * FROM plugins ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`,words:(e,t,i,o)=>`SELECT * FROM words ORDER BY ${e} ${t} LIMIT ${i} OFFSET ${o}`}),getByKeysStatement:Oe({notes:e=>`SELECT * FROM notes WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,bookmarks:e=>`SELECT * FROM bookmarks WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,books:e=>`SELECT * FROM books WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,plugins:e=>`SELECT * FROM plugins WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`,words:e=>`SELECT * FROM words WHERE key IN (${e.map((()=>"?")).join(",")}) ORDER BY CASE key ${e.map(((e,t)=>`WHEN ? THEN ${t}`)).join(" ")} END`}),deleteByBookKeyStatement:Oe(Te)},jsonToSqlite:Oe({notes:e=>{let t=Object.assign({},e);return t.date=JSON.stringify(e.date),t.tag=JSON.stringify(e.tag),t},bookmarks:e=>e,books:e=>{let t=Object.assign({},e);return t.page=e.page||0,t},plugins:e=>{let t=Object.assign({},e);return e.autoValue||(t.autoValue=null),e.langList?t.langList=JSON.stringify(e.langList):t.langList=null,e.voiceList?t.voiceList=JSON.stringify(e.voiceList):t.voiceList=null,t.config=JSON.stringify(e.config),t},words:e=>{let t=Object.assign({},e);return t.date=JSON.stringify(e.date),void 0===t.sentence&&(t.sentence=""),t}}),sqliteToJson:Oe(xe)};const Ce=T,_e=S;class Pe{constructor(e,t,i){this.TokenService=e,this.ConfigService=t,this.baseUrl="china"===i?_e:Ce,this.serverRegion=i,this.refreshToken="",this.accessToken="",this.streamPromise=null,this.expiresAt=0}refreshUserToken(){return b(this,void 0,void 0,(function*(){if(this.refreshToken=yield this.TokenService.getToken("refresh_token"),!this.refreshToken)return{code:401,message:"refresh token not found"};let t=(yield e.post(this.baseUrl+"/api/v1/public/user/refresh_token",{refresh_token:this.refreshToken})).data;return 200===t.code&&(yield this.TokenService.setToken("access_token",t.data.access_token),yield this.TokenService.setToken("refresh_token",t.data.refresh_token),yield this.TokenService.setToken("expires_at",(1e3*t.data.expires_at).toString()),this.accessToken=t.data.access_token,this.refreshToken=t.data.refresh_token,this.expiresAt=1e3*t.data.expires_at),t}))}requestWithRetry(e){return b(this,void 0,void 0,(function*(){return Pe.requestQueue||(Pe.requestQueue=[]),new Promise(((t,i)=>{Pe.requestQueue.push({config:e,resolve:t,reject:i}),Pe.processingQueue||this.processQueue()}))}))}isTokenValid(){return b(this,void 0,void 0,(function*(){if(this.accessToken||(this.accessToken=(yield this.TokenService.getToken("access_token"))||""),!this.expiresAt){const e=yield this.TokenService.getToken("expires_at");this.expiresAt=e?parseInt(e):(new Date).getTime()+31536e9}return""!==this.accessToken&&this.expiresAt>(new Date).getTime()+6e4}))}processQueue(){return b(this,void 0,void 0,(function*(){if(!Pe.processingQueue){Pe.processingQueue=!0;try{for(;Pe.requestQueue.length>0;){const e=Pe.requestQueue.shift();try{let t=yield this.executeRequest(e.config);e.resolve(t)}catch(t){e.reject(t)}}}finally{Pe.processingQueue=!1}}}))}executeRequest(t){return b(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let i="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);if(t.baseURL=this.baseUrl,t.headers)t.headers.Authorization="Bearer "+this.accessToken,t.headers["X-Request-ID"]=i;else{let e=this.ConfigService.getItem("appVersion"),o=this.ConfigService.getItem("appPlatform");t.headers={Authorization:"Bearer "+this.accessToken,"X-Request-ID":i,"X-App-Version":e||"1.0.0","X-App-Platform":o||"web"}}let o=(yield e(t)).data;if(402===o.code){let i=yield this.refreshUserToken();if(200===i.code){return t.headers=t.headers||{},t.headers.Authorization="Bearer "+this.accessToken,(yield e(t)).data}return i}return 200!==o.code&&console.error("Request error:",o),o}catch(e){return console.error("Request execution error:",e),"Network Error"===e.message?{code:503,message:"network error",data:null,msg:"Network error, please try again later. 网络错误,请稍后再试。"}:{code:500,message:e.message||"Unknown error",msg:e.message||"Unknown error",data:null}}}))}requestWithStream(e,t,i){return b(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>b(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let o=this.accessToken||"",r="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((s,n)=>{let a=this.ConfigService.getItem("appVersion"),d=this.ConfigService.getItem("appPlatform");const l=new i(this.baseUrl+e.url,{headers:{"Content-Type":"application/json",Authorization:"Bearer "+o,"X-Request-ID":r,"X-App-Version":a||"1.0.0","X-App-Platform":d||"web"},method:e.method,body:JSON.stringify(e.data),pollingInterval:0});l.addEventListener("open",(()=>{console.info("Connection to OpenAI established.")})),l.addEventListener("message",(e=>b(this,void 0,void 0,(function*(){if(!e.data)return;const i=JSON.parse(e.data);i.done?(l.close(),s(i)):t(i.data)})))),l.addEventListener("error",(e=>{if(console.info("Error:",e),!e.data)return;const i=JSON.parse(e.data);t(i.data),s(i),l.close()}))}))}finally{this.streamPromise=null}})))()),this.streamPromise}))}requestWithFetch(e,t){return b(this,void 0,void 0,(function*(){return this.streamPromise||(this.streamPromise=(()=>b(this,void 0,void 0,(function*(){try{(yield this.isTokenValid())||(yield this.refreshUserToken());let i=this.accessToken||"",o="req-"+Date.now().toString(36)+"-"+Math.random().toString(36).substring(2,11);return new Promise(((r,s)=>b(this,void 0,void 0,(function*(){let s=this.ConfigService.getItem("appVersion"),n=this.ConfigService.getItem("appPlatform");var a=new v(this.baseUrl+e.url,{headers:{"Content-Type":"text/plain",Authorization:"Bearer "+i,"X-Request-ID":o,"X-App-Version":s||"1.0.0","X-App-Platform":n||"web"},payload:JSON.stringify(e.data),method:"POST"});a.addEventListener("message",(e=>b(this,void 0,void 0,(function*(){if(!e.data)return;const i=JSON.parse(e.data);i.done?(a.close(),r(i)):t(i.data)})))),a.addEventListener("open",(e=>{console.info(e,"Connection to OpenAI established.")})),a.addEventListener("error",(e=>{if(console.error(e,"Error occurred while connecting to OpenAI"),!e.data)return;const i=JSON.parse(e.data);t(i.data),r(i),a.close()}))}))))}finally{this.streamPromise=null}})))()),this.streamPromise}))}}Pe.processingQueue=!1,Pe.requestQueue=[];class Ae extends Pe{constructor(e,t,i){super(e,t,i),this.serverRegion=i}encryptToken(e){return b(this,void 0,void 0,(function*(){let t=e.token,i=w.encode(t),{extracted:o,remaining:r}=function(e){let t="",i="",o=[],r=1;for(;r<=e.length;)o.push(r-1),r*=2;for(let r=0;r-1){let i=t.split("#");e.encrypted_token=i[1]}const i={method:"post",url:"/api/v1/pro/thirdparty/decrypt_token",data:e};let o=yield this.requestWithRetry(i);if(t.indexOf("#")>-1&&o.data&&o.data.token){let e=t.split("#"),i=function(e,t){let i="",o=[],r=1,s=e.length+t.length;for(;r<=s;)o.push(r-1),r*=2;let n=0,a=0;for(let r=0;r-1&&i.splice(o,1),this.setAllListConfig(i,t)}static setListConfig(e,t){let i=this.getAllListConfig(t);const o=i.indexOf(e);o>-1?(i.splice(o,1),i.unshift(e)):i.unshift(e),this.setAllListConfig(i,t)}static setAllListConfig(e,t,i=!0){this.setItem(t,JSON.stringify(e)),i&&this.setSyncRecord({type:"config",catergory:"listConfig",name:"general",key:t},{operation:"update",time:Date.now()})}static setObjectConfig(e,t,i,o=!0){let r=this.getAllObjectConfig(i);r[e]=t,o&&this.setSyncRecord({type:"config",catergory:"objectConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllObjectConfig(r,i)}static getObjectConfig(e,t,i){return this.getAllObjectConfig(t)[e]||i}static getAllObjectConfig(e){let t=this.getItem(e);return JSON.parse(t)||{}}static setAllObjectConfig(e,t){this.setItem(t,JSON.stringify(e))}static deleteObjectConfig(e,t){let i=this.getAllObjectConfig(t);delete i[e],this.setSyncRecord({type:"config",catergory:"objectConfig",name:t,key:e},{operation:"delete",time:Date.now()}),this.setAllObjectConfig(i,t)}static getAllMapConfig(e){let t=this.getItem(e);return JSON.parse(t)||{}}static getMapConfig(e,t){return this.getAllMapConfig(t)[e]||[]}static setAllMapConfig(e,t){this.setItem(t,JSON.stringify(e))}static setMapConfig(e,t,i){let o=this.getAllMapConfig(i);void 0===o[e]&&(o[e]=[]),t&&-1===o[e].indexOf(t)&&o[e].unshift(t),this.setSyncRecord({type:"config",catergory:"mapConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,i)}static setOneMapConfig(e,t,i,o=!0){let r=this.getAllMapConfig(i);r[e]=t,o&&this.setSyncRecord({type:"config",catergory:"mapConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(r,i)}static deleteFromMapConfig(e,t,i){let o=this.getAllMapConfig(i),r=o[e].indexOf(t);o[e].splice(r,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:i,key:e},{operation:"update",time:Date.now()}),this.setAllMapConfig(o,i)}static deleteFromAllMapConfig(e,t){let i=this.getAllMapConfig(t);Object.keys(i).forEach((o=>{let r=i[o].indexOf(e);r>-1&&(i[o].splice(r,1),this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:o},{operation:"update",time:Date.now()}))})),this.setAllMapConfig(i,t)}static deleteMapConfig(e,t){let i=this.getAllMapConfig(t);delete i[e],this.setSyncRecord({type:"config",catergory:"mapConfig",name:t,key:e},{operation:"delete",time:Date.now()}),this.setAllMapConfig(i,t)}static getFromAllMapConfig(e,t){let i=this.getAllMapConfig(t),o=[];for(let t in i)i[t]&&i[t].indexOf(e)>-1&&o.push(t);return o}static getSyncRecord(e){return JSON.parse(this.getItem("syncRecord")||"{}")[e.type+"."+e.catergory+"."+e.name+"."+e.key]||{operation:"",time:0}}static getAllSyncRecord(){return JSON.parse(this.getItem("syncRecord")||"{}")}static setSyncRecord(e,t){const i=e.type+"."+e.catergory+"."+e.name+"."+e.key;let o=JSON.parse(this.getItem("syncRecord")||"{}");o[i]=t,this.setItem("syncRecord",JSON.stringify(o))}static setAllSyncRecord(e){this.setItem("syncRecord",JSON.stringify(e))}});var Le,ze;export{$e as ConfigService,Re as SqlStatement,Fe as SyncUtil,Ae as ThirdpartyRequest}; diff --git a/src/components/popups/popupAssist/component.tsx b/src/components/popups/popupAssist/component.tsx index a3a59ed8..27c8cd53 100644 --- a/src/components/popups/popupAssist/component.tsx +++ b/src/components/popups/popupAssist/component.tsx @@ -467,7 +467,6 @@ class PopupAssist extends React.Component { } toast.loading(this.props.t("Please wait"), { id: "report-feedback" }); try { - console.log("Reporting answer:", this.props.userInfo); await axios.post("https://api.koodoreader.com/api/llm_report", { answer: content, question: userMessage?.content || "", From 6d79cb544b6607bd2f0d74d83e3ae20bab2f7b47 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Sun, 4 Oct 2026 10:27:48 +0800 Subject: [PATCH 30/42] Reduce background overlay opacity in background settings for improved visibility --- src/assets/lib/kookit.min.js | 2 +- .../settings/backgroundSetting/backgroundSetting.css | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/src/assets/lib/kookit.min.js b/src/assets/lib/kookit.min.js index c18adceb..8c680144 100644 --- a/src/assets/lib/kookit.min.js +++ b/src/assets/lib/kookit.min.js @@ -1 +1 @@ -import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();if(0===rect.width||0===rect.height)return!1;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{if(resolved)return;null===startTime&&(startTime=now);const progress=Math.min(1,(now-startTime)/250);body.scrollLeft=startLeft+distance*(t=>1-Math.pow(1-t,3))(progress),progress<1?window.scrollAnimationId=requestAnimationFrame(step):resolved||(resolved=!0,body.style.willChange="",body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1)};window.scrollAnimationId=requestAnimationFrame(step)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if("yes"!==this.isShowTotalPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if("yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.quickErase="no",this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.quickErase=config.quickErase||"no",this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),config.quickErase&&this.setQuickErase(config.quickErase),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),"yes"===this.quickErase)canvas.remove(obj);else if(this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setQuickErase(quickErase){this.quickErase=quickErase}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),this.trigger("chapter-pages"),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getPages(){return this.chapterDocList.map((_item,index)=>index+1)}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterSizeCache=null,this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; +import _ from"underscore";import rangy from"rangy/lib/rangy-core.js";import"rangy/lib/rangy-textrange";import JSZip from"jszip";import*as fflate from"fflate";import{unzlibSync}from"fflate";import chardet from"chardet";import untar from"js-untar";import mammoth from"mammoth";import{marked}from"marked";import mhtml2html from"mhtml2html";function __awaiter(thisArg,_arguments,P,generator){return new(P||(P=Promise))(function(resolve,reject){function fulfilled(value){try{step(generator.next(value))}catch(e){reject(e)}}function rejected(value){try{step(generator.throw(value))}catch(e){reject(e)}}function step(result){var value;result.done?resolve(result.value):(value=result.value,value instanceof P?value:new P(function(resolve){resolve(value)})).then(fulfilled,rejected)}step((generator=generator.apply(thisArg,_arguments||[])).next())})}const s2tData={"㐷":"傌","㐹":"㑶","㐽":"偑","㑇":"㑳","㑈":"倲","㑔":"㑯","㑩":"儸","㓆":"𠗣","㓥":"劏","㓰":"劃","㔉":"劚","㖊":"噚","㖞":"喎","㘎":"㘚","㚯":"㜄","㛀":"媰","㛟":"𡞵","㛠":"𡢃","㛣":"㜏","㛤":"孋","㛿":"𡠹","㟆":"㠏","㟜":"𡾱","㟥":"嵾","㡎":"幓","㤘":"㥮","㤽":"懤","㥪":"慺","㧏":"掆","㧐":"㩳","㧑":"撝","㧟":"擓","㧰":"擽","㨫":"㩜","㭎":"棡","㭏":"椲","㭣":"𣙎","㭤":"樢","㭴":"樫","㱩":"殰","㱮":"殨","㲿":"瀇","㳔":"濧","㳕":"灡","㳠":"澾","㳡":"濄","㳢":"𣾷","㳽":"瀰","㴋":"潚","㶉":"鸂","㶶":"燶","㶽":"煱","㺍":"獱","㻅":"璯","㻏":"𤫩","㻘":"𤪺","䀥":"䁻","䁖":"瞜","䂵":"碽","䃅":"磾","䅉":"稏","䅟":"穇","䅪":"𥢢","䇲":"筴","䉤":"籔","䌶":"䊷","䌷":"紬","䌸":"縳","䌹":"絅","䌺":"䋙","䌻":"䋚","䌼":"綐","䌽":"綵","䌾":"䋻","䌿":"䋹","䍀":"繿","䍁":"繸","䍠":"䍦","䎬":"䎱","䏝":"膞","䑽":"𦪙","䓓":"薵","䓕":"薳","䓖":"藭","䓨":"罃","䗖":"螮","䘛":"𧝞","䘞":"𧜗","䙊":"𧜵","䙌":"䙡","䙓":"襬","䜣":"訢","䜤":"鿁","䜥":"𧩙","䜧":"䜀","䜩":"讌","䝙":"貙","䞌":"𧵳","䞍":"䝼","䞎":"𧶧","䞐":"賰","䟢":"躎","䢀":"𨊰","䢁":"𨊸","䢂":"𨋢","䥺":"釾","䥽":"鏺","䥾":"䥱","䥿":"𨯅","䦀":"𨦫","䦁":"𨧜","䦂":"䥇","䦃":"鐯","䦅":"鐥","䦆":"钁","䦶":"䦛","䦷":"䦟","䩄":"靦","䭪":"𩞯","䯃":"𩣑","䯄":"騧","䯅":"䯀","䲝":"䱽","䲞":"𩶘","䲟":"鮣","䲠":"鰆","䲡":"鰌","䲢":"鰧","䲣":"䱷","䴓":"鳾","䴔":"鵁","䴕":"鴷","䴖":"鶄","䴗":"鶪","䴘":"鷉","䴙":"鸊","䶮":"龑","万":"萬","与":"與","丑":"醜","专":"專","业":"業","丛":"叢","东":"東","丝":"絲","丢":"丟","两":"兩","严":"嚴","丧":"喪","个":"個","丰":"豐","临":"臨","为":"爲","丽":"麗","举":"舉","么":"麼","义":"義","乌":"烏","乐":"樂","乔":"喬","习":"習","乡":"鄉","书":"書","买":"買","乱":"亂","了":"了","争":"爭","于":"於","亏":"虧","云":"雲","亘":"亙","亚":"亞","产":"產","亩":"畝","亲":"親","亵":"褻","亸":"嚲","亿":"億","仅":"僅","仆":"僕","仇":"仇","从":"從","仑":"侖","仓":"倉","仪":"儀","们":"們","价":"價","仿":"仿","众":"衆","优":"優","伙":"夥","会":"會","伛":"傴","伞":"傘","伟":"偉","传":"傳","伡":"俥","伣":"俔","伤":"傷","伥":"倀","伦":"倫","伧":"傖","伪":"僞","伫":"佇","体":"體","余":"餘","佛":"佛","佣":"傭","佥":"僉","侠":"俠","侣":"侶","侥":"僥","侦":"偵","侧":"側","侨":"僑","侩":"儈","侪":"儕","侬":"儂","侭":"儘","俊":"俊","俣":"俁","俦":"儔","俨":"儼","俩":"倆","俪":"儷","俫":"倈","俭":"儉","修":"修","借":"借","债":"債","倾":"傾","偬":"傯","偻":"僂","偾":"僨","偿":"償","傤":"儎","傥":"儻","傧":"儐","储":"儲","傩":"儺","僵":"僵","儿":"兒","克":"克","兑":"兌","兖":"兗","党":"黨","兰":"蘭","关":"關","兴":"興","兹":"茲","养":"養","兽":"獸","冁":"囅","内":"內","冈":"岡","册":"冊","写":"寫","军":"軍","农":"農","冬":"冬","冯":"馮","冲":"衝","决":"決","况":"況","冻":"凍","净":"淨","凄":"悽","准":"準","凉":"涼","凌":"凌","减":"減","凑":"湊","凛":"凜","几":"幾","凤":"鳳","凫":"鳧","凭":"憑","凯":"凱","凶":"兇","出":"出","击":"擊","凿":"鑿","刍":"芻","划":"劃","刘":"劉","则":"則","刚":"剛","创":"創","删":"刪","别":"別","刬":"剗","刭":"剄","刮":"刮","制":"制","刹":"剎","刽":"劊","刾":"㓨","刿":"劌","剀":"剴","剂":"劑","剐":"剮","剑":"劍","剥":"剝","剧":"劇","劝":"勸","办":"辦","务":"務","劢":"勱","动":"動","励":"勵","劲":"勁","劳":"勞","势":"勢","勋":"勳","勚":"勩","匀":"勻","匦":"匭","匮":"匱","区":"區","医":"醫","千":"千","升":"升","华":"華","协":"協","单":"單","卖":"賣","卜":"卜","占":"佔","卢":"盧","卤":"滷","卧":"臥","卫":"衛","却":"卻","卷":"卷","卺":"巹","厂":"廠","厅":"廳","历":"歷","厉":"厲","压":"壓","厌":"厭","厍":"厙","厐":"龎","厕":"廁","厘":"釐","厢":"廂","厣":"厴","厦":"廈","厨":"廚","厩":"廄","厮":"廝","县":"縣","叁":"叄","参":"參","叆":"靉","叇":"靆","双":"雙","发":"發","变":"變","叙":"敘","叠":"疊","只":"只","台":"臺","叶":"葉","号":"號","叹":"嘆","叽":"嘰","吁":"籲","吃":"喫","合":"合","吊":"吊","同":"同","后":"後","向":"向","吓":"嚇","吕":"呂","吗":"嗎","吨":"噸","听":"聽","启":"啓","吴":"吳","呐":"吶","呒":"嘸","呓":"囈","呕":"嘔","呖":"嚦","呗":"唄","员":"員","呙":"咼","呛":"嗆","呜":"嗚","周":"周","咏":"詠","咙":"嚨","咛":"嚀","咝":"噝","咤":"吒","咨":"諮","咸":"鹹","咽":"咽","哄":"哄","响":"響","哑":"啞","哒":"噠","哓":"嘵","哔":"嗶","哕":"噦","哗":"譁","哙":"噲","哜":"嚌","哝":"噥","哟":"喲","唇":"脣","唛":"嘜","唝":"嗊","唠":"嘮","唡":"啢","唢":"嗩","唤":"喚","啧":"嘖","啬":"嗇","啭":"囀","啮":"齧","啯":"嘓","啰":"囉","啴":"嘽","啸":"嘯","喂":"喂","喷":"噴","喽":"嘍","喾":"嚳","嗫":"囁","嗳":"噯","嘘":"噓","嘤":"嚶","嘱":"囑","噜":"嚕","噪":"噪","嚣":"囂","回":"回","团":"團","园":"園","困":"困","囱":"囪","围":"圍","囵":"圇","国":"國","图":"圖","圆":"圓","圣":"聖","圹":"壙","场":"場","坏":"壞","块":"塊","坚":"堅","坛":"壇","坜":"壢","坝":"壩","坞":"塢","坟":"墳","坠":"墜","垄":"壟","垅":"壠","垆":"壚","垒":"壘","垦":"墾","垩":"堊","垫":"墊","垭":"埡","垯":"墶","垱":"壋","垲":"塏","垴":"堖","埘":"塒","埙":"壎","埚":"堝","堑":"塹","堕":"墮","塆":"壪","墙":"牆","壮":"壯","声":"聲","壳":"殼","壶":"壺","壸":"壼","处":"處","备":"備","复":"復","够":"夠","夫":"夫","头":"頭","夸":"誇","夹":"夾","夺":"奪","奁":"奩","奂":"奐","奋":"奮","奖":"獎","奥":"奧","奸":"奸","妆":"妝","妇":"婦","妈":"媽","妩":"嫵","妪":"嫗","妫":"嬀","姗":"姍","姜":"姜","姹":"奼","娄":"婁","娅":"婭","娆":"嬈","娇":"嬌","娈":"孌","娘":"娘","娱":"娛","娲":"媧","娴":"嫺","婳":"嫿","婴":"嬰","婵":"嬋","婶":"嬸","媪":"媼","媭":"嬃","嫒":"嬡","嫔":"嬪","嫱":"嬙","嬷":"嬤","孙":"孫","学":"學","孪":"孿","宁":"寧","它":"它","宝":"寶","实":"實","宠":"寵","审":"審","宪":"憲","宫":"宮","家":"家","宽":"寬","宾":"賓","寝":"寢","对":"對","寻":"尋","导":"導","寿":"壽","将":"將","尔":"爾","尘":"塵","尝":"嘗","尧":"堯","尴":"尷","尸":"屍","尽":"盡","局":"局","层":"層","屃":"屓","屉":"屜","届":"屆","属":"屬","屡":"屢","屦":"屨","屿":"嶼","岁":"歲","岂":"豈","岖":"嶇","岗":"崗","岘":"峴","岚":"嵐","岛":"島","岩":"巖","岭":"嶺","岳":"嶽","岽":"崬","岿":"巋","峃":"嶨","峄":"嶧","峡":"峽","峣":"嶢","峤":"嶠","峥":"崢","峦":"巒","峰":"峯","崂":"嶗","崃":"崍","崄":"嶮","崭":"嶄","嵘":"嶸","嵚":"嶔","嵝":"嶁","巅":"巔","巨":"巨","巩":"鞏","巯":"巰","币":"幣","布":"布","帅":"帥","师":"師","帏":"幃","帐":"帳","帘":"簾","帜":"幟","带":"帶","帧":"幀","席":"席","帮":"幫","帱":"幬","帻":"幘","帼":"幗","幂":"冪","干":"幹","并":"並","幸":"幸","广":"廣","庄":"莊","庆":"慶","床":"牀","庐":"廬","庑":"廡","库":"庫","应":"應","庙":"廟","庞":"龐","废":"廢","庵":"庵","庼":"廎","廪":"廩","开":"開","异":"異","弃":"棄","弑":"弒","张":"張","弥":"彌","弦":"弦","弪":"弳","弯":"彎","弹":"彈","强":"強","归":"歸","当":"當","录":"錄","彟":"彠","彦":"彥","彨":"彲","彩":"彩","彻":"徹","征":"徵","径":"徑","徕":"徠","御":"御","忆":"憶","忏":"懺","志":"志","忧":"憂","念":"念","忾":"愾","怀":"懷","态":"態","怂":"慫","怃":"憮","怄":"慪","怅":"悵","怆":"愴","怜":"憐","总":"總","怼":"懟","怿":"懌","恋":"戀","恒":"恆","恤":"恤","恳":"懇","恶":"惡","恸":"慟","恹":"懨","恺":"愷","恻":"惻","恼":"惱","恽":"惲","悦":"悅","悫":"愨","悬":"懸","悭":"慳","悮":"悞","悯":"憫","惊":"驚","惧":"懼","惨":"慘","惩":"懲","惫":"憊","惬":"愜","惭":"慚","惮":"憚","惯":"慣","愈":"愈","愠":"慍","愤":"憤","愦":"憒","愿":"願","慑":"懾","慭":"憖","懑":"懣","懒":"懶","懔":"懍","戆":"戇","戋":"戔","戏":"戲","戗":"戧","战":"戰","戚":"戚","戬":"戩","戯":"戱","户":"戶","才":"才","扎":"扎","扑":"撲","托":"託","扣":"扣","执":"執","扩":"擴","扪":"捫","扫":"掃","扬":"揚","扰":"擾","折":"折","抚":"撫","抛":"拋","抟":"摶","抠":"摳","抡":"掄","抢":"搶","护":"護","报":"報","抵":"抵","担":"擔","拐":"拐","拟":"擬","拢":"攏","拣":"揀","拥":"擁","拦":"攔","拧":"擰","拨":"撥","择":"擇","挂":"掛","挚":"摯","挛":"攣","挜":"掗","挝":"撾","挞":"撻","挟":"挾","挠":"撓","挡":"擋","挢":"撟","挣":"掙","挤":"擠","挥":"揮","挦":"撏","挨":"挨","挽":"挽","捝":"挩","捞":"撈","损":"損","捡":"撿","换":"換","捣":"搗","据":"據","掳":"擄","掴":"摑","掷":"擲","掸":"撣","掺":"摻","掼":"摜","揽":"攬","揾":"搵","揿":"撳","搀":"攙","搁":"擱","搂":"摟","搄":"揯","搅":"攪","搜":"搜","携":"攜","摄":"攝","摅":"攄","摆":"擺","摇":"搖","摈":"擯","摊":"攤","撄":"攖","撑":"撐","撵":"攆","撷":"擷","撸":"擼","撺":"攛","擜":"㩵","擞":"擻","攒":"攢","敌":"敵","敚":"敓","敛":"斂","敩":"斆","数":"數","斋":"齋","斓":"斕","斗":"鬥","斩":"斬","断":"斷","旋":"旋","无":"無","旧":"舊","时":"時","旷":"曠","旸":"暘","昆":"昆","昙":"曇","昵":"暱","昼":"晝","昽":"曨","显":"顯","晋":"晉","晒":"曬","晓":"曉","晔":"曄","晕":"暈","晖":"暉","暂":"暫","暅":"𣈶","暗":"暗","暧":"曖","曲":"曲","术":"術","朱":"朱","朴":"樸","机":"機","杀":"殺","杂":"雜","权":"權","杆":"杆","杠":"槓","条":"條","来":"來","杨":"楊","杩":"榪","杯":"杯","杰":"傑","松":"松","板":"板","极":"極","构":"構","枞":"樅","枢":"樞","枣":"棗","枥":"櫪","枧":"梘","枨":"棖","枪":"槍","枫":"楓","枭":"梟","柜":"櫃","柠":"檸","柽":"檉","栀":"梔","栅":"柵","标":"標","栈":"棧","栉":"櫛","栊":"櫳","栋":"棟","栌":"櫨","栎":"櫟","栏":"欄","树":"樹","栖":"棲","栗":"栗","样":"樣","核":"核","栾":"欒","桠":"椏","桡":"橈","桢":"楨","档":"檔","桤":"榿","桥":"橋","桦":"樺","桧":"檜","桨":"槳","桩":"樁","桪":"樳","梁":"梁","梦":"夢","梼":"檮","梾":"棶","梿":"槤","检":"檢","棁":"梲","棂":"欞","椁":"槨","椝":"槼","椟":"櫝","椠":"槧","椢":"槶","椤":"欏","椫":"樿","椭":"橢","椮":"槮","楼":"樓","榄":"欖","榅":"榲","榇":"櫬","榈":"櫚","榉":"櫸","榝":"樧","槚":"檟","槛":"檻","槟":"檳","槠":"櫧","横":"橫","樯":"檣","樱":"櫻","橥":"櫫","橱":"櫥","橹":"櫓","橼":"櫞","檩":"檁","欢":"歡","欤":"歟","欧":"歐","欲":"欲","歼":"殲","殁":"歿","殇":"殤","残":"殘","殒":"殞","殓":"殮","殚":"殫","殡":"殯","殴":"毆","毁":"毀","毂":"轂","毕":"畢","毙":"斃","毡":"氈","毵":"毿","毶":"𣯶","氇":"氌","气":"氣","氢":"氫","氩":"氬","氲":"氳","汇":"匯","汉":"漢","汤":"湯","汹":"洶","沄":"澐","沈":"沈","沟":"溝","没":"沒","沣":"灃","沤":"漚","沥":"瀝","沦":"淪","沧":"滄","沨":"渢","沩":"潙","沪":"滬","沾":"沾","泛":"泛","泞":"濘","注":"注","泪":"淚","泶":"澩","泷":"瀧","泸":"瀘","泺":"濼","泻":"瀉","泼":"潑","泽":"澤","泾":"涇","洁":"潔","洒":"灑","洼":"窪","浃":"浹","浅":"淺","浆":"漿","浇":"澆","浈":"湞","浉":"溮","浊":"濁","测":"測","浍":"澮","济":"濟","浏":"瀏","浐":"滻","浑":"渾","浒":"滸","浓":"濃","浔":"潯","浕":"濜","涂":"塗","涌":"湧","涚":"涗","涛":"濤","涝":"澇","涞":"淶","涟":"漣","涠":"潿","涡":"渦","涢":"溳","涣":"渙","涤":"滌","润":"潤","涧":"澗","涨":"漲","涩":"澀","淀":"澱","渊":"淵","渌":"淥","渍":"漬","渎":"瀆","渐":"漸","渑":"澠","渔":"漁","渖":"瀋","渗":"滲","温":"溫","游":"遊","湾":"灣","湿":"溼","溁":"濚","溃":"潰","溅":"濺","溆":"漵","溇":"漊","滗":"潷","滚":"滾","滞":"滯","滟":"灩","滠":"灄","满":"滿","滢":"瀅","滤":"濾","滥":"濫","滦":"灤","滨":"濱","滩":"灘","滪":"澦","漓":"漓","潆":"瀠","潇":"瀟","潋":"瀲","潍":"濰","潜":"潛","潴":"瀦","澛":"瀂","澜":"瀾","濑":"瀨","濒":"瀕","灏":"灝","灭":"滅","灯":"燈","灵":"靈","灶":"竈","灾":"災","灿":"燦","炀":"煬","炉":"爐","炖":"燉","炜":"煒","炝":"熗","点":"點","炼":"煉","炽":"熾","烁":"爍","烂":"爛","烃":"烴","烛":"燭","烟":"煙","烦":"煩","烧":"燒","烨":"燁","烩":"燴","烫":"燙","烬":"燼","热":"熱","焕":"煥","焖":"燜","焘":"燾","煴":"熅","熏":"燻","爱":"愛","爷":"爺","牍":"牘","牦":"犛","牵":"牽","牺":"犧","犊":"犢","状":"狀","犷":"獷","犸":"獁","犹":"猶","狈":"狽","狝":"獮","狞":"獰","独":"獨","狭":"狹","狮":"獅","狯":"獪","狰":"猙","狱":"獄","狲":"猻","猃":"獫","猎":"獵","猕":"獼","猡":"玀","猪":"豬","猫":"貓","猬":"蝟","献":"獻","獭":"獺","玑":"璣","玙":"璵","玚":"瑒","玛":"瑪","玩":"玩","玮":"瑋","环":"環","现":"現","玱":"瑲","玺":"璽","珐":"琺","珑":"瓏","珰":"璫","珲":"琿","琎":"璡","琏":"璉","琐":"瑣","琼":"瓊","瑶":"瑤","瑷":"璦","瑸":"璸","璇":"璇","璎":"瓔","瓒":"瓚","瓮":"甕","瓯":"甌","电":"電","画":"畫","畅":"暢","畴":"疇","疖":"癤","疗":"療","疟":"瘧","疠":"癘","疡":"瘍","疬":"癧","疭":"瘲","疮":"瘡","疯":"瘋","疱":"皰","疴":"痾","症":"症","痈":"癰","痉":"痙","痒":"癢","痖":"瘂","痨":"癆","痪":"瘓","痫":"癇","痴":"癡","瘅":"癉","瘆":"瘮","瘗":"瘞","瘘":"瘻","瘪":"癟","瘫":"癱","瘾":"癮","瘿":"癭","癞":"癩","癣":"癬","癫":"癲","皂":"皁","皑":"皚","皱":"皺","皲":"皸","盏":"盞","盐":"鹽","监":"監","盖":"蓋","盗":"盜","盘":"盤","眍":"瞘","眦":"眥","眬":"矓","睁":"睜","睐":"睞","睑":"瞼","瞆":"瞶","瞒":"瞞","瞩":"矚","矩":"矩","矫":"矯","矶":"磯","矾":"礬","矿":"礦","砀":"碭","码":"碼","砖":"磚","砗":"硨","砚":"硯","砜":"碸","砺":"礪","砻":"礱","砾":"礫","础":"礎","硁":"硜","硕":"碩","硖":"硤","硗":"磽","硙":"磑","硚":"礄","确":"確","硵":"磠","硷":"礆","碍":"礙","碛":"磧","碜":"磣","碱":"鹼","礼":"禮","祃":"禡","祎":"禕","祢":"禰","祯":"禎","祷":"禱","祸":"禍","禀":"稟","禄":"祿","禅":"禪","离":"離","私":"私","秃":"禿","秆":"稈","秋":"秋","种":"種","秘":"祕","积":"積","称":"稱","秽":"穢","秾":"穠","稆":"穭","税":"稅","稣":"穌","稳":"穩","穑":"穡","穞":"穭","穷":"窮","窃":"竊","窍":"竅","窎":"窵","窑":"窯","窜":"竄","窝":"窩","窥":"窺","窦":"竇","窭":"窶","竖":"豎","竞":"競","笃":"篤","笋":"筍","笔":"筆","笕":"筧","笺":"箋","笼":"籠","笾":"籩","筑":"築","筚":"篳","筛":"篩","筜":"簹","筝":"箏","筹":"籌","筼":"篔","签":"籤","筿":"篠","简":"簡","箓":"籙","箦":"簀","箧":"篋","箨":"籜","箩":"籮","箪":"簞","箫":"簫","篑":"簣","篓":"簍","篮":"籃","篯":"籛","篱":"籬","簖":"籪","籁":"籟","籴":"糴","类":"類","籼":"秈","粜":"糶","粝":"糲","粤":"粵","粪":"糞","粮":"糧","粽":"糉","糁":"糝","糇":"餱","糍":"餈","系":"系","紧":"緊","絷":"縶","緼":"縕","縆":"緪","纟":"糹","纠":"糾","纡":"紆","红":"紅","纣":"紂","纤":"纖","纥":"紇","约":"約","级":"級","纨":"紈","纩":"纊","纪":"紀","纫":"紉","纬":"緯","纭":"紜","纮":"紘","纯":"純","纰":"紕","纱":"紗","纲":"綱","纳":"納","纴":"紝","纵":"縱","纶":"綸","纷":"紛","纸":"紙","纹":"紋","纺":"紡","纻":"紵","纼":"紖","纽":"紐","纾":"紓","线":"線","绀":"紺","绁":"紲","绂":"紱","练":"練","组":"組","绅":"紳","细":"細","织":"織","终":"終","绉":"縐","绊":"絆","绋":"紼","绌":"絀","绍":"紹","绎":"繹","经":"經","绐":"紿","绑":"綁","绒":"絨","结":"結","绔":"絝","绕":"繞","绖":"絰","绗":"絎","绘":"繪","给":"給","绚":"絢","绛":"絳","络":"絡","绝":"絕","绞":"絞","统":"統","绠":"綆","绡":"綃","绢":"絹","绣":"繡","绤":"綌","绥":"綏","绦":"絛","继":"繼","绨":"綈","绩":"績","绪":"緒","绫":"綾","绬":"緓","续":"續","绮":"綺","绯":"緋","绰":"綽","绱":"鞝","绲":"緄","绳":"繩","维":"維","绵":"綿","绶":"綬","绷":"繃","绸":"綢","绹":"綯","绺":"綹","绻":"綣","综":"綜","绽":"綻","绾":"綰","绿":"綠","缀":"綴","缁":"緇","缂":"緙","缃":"緗","缄":"緘","缅":"緬","缆":"纜","缇":"緹","缈":"緲","缉":"緝","缊":"縕","缋":"繢","缌":"緦","缍":"綞","缎":"緞","缏":"緶","缐":"線","缑":"緱","缒":"縋","缓":"緩","缔":"締","缕":"縷","编":"編","缗":"緡","缘":"緣","缙":"縉","缚":"縛","缛":"縟","缜":"縝","缝":"縫","缞":"縗","缟":"縞","缠":"纏","缡":"縭","缢":"縊","缣":"縑","缤":"繽","缥":"縹","缦":"縵","缧":"縲","缨":"纓","缩":"縮","缪":"繆","缫":"繅","缬":"纈","缭":"繚","缮":"繕","缯":"繒","缰":"繮","缱":"繾","缲":"繰","缳":"繯","缴":"繳","缵":"纘","罂":"罌","网":"網","罗":"羅","罚":"罰","罢":"罷","罴":"羆","羁":"羈","羟":"羥","羡":"羨","群":"羣","翘":"翹","翙":"翽","翚":"翬","耢":"耮","耧":"耬","耸":"聳","耻":"恥","聂":"聶","聋":"聾","职":"職","聍":"聹","联":"聯","聩":"聵","聪":"聰","肃":"肅","肠":"腸","肤":"膚","肮":"骯","肴":"餚","肾":"腎","肿":"腫","胀":"脹","胁":"脅","胄":"胄","胆":"膽","背":"背","胜":"勝","胡":"胡","胧":"朧","胨":"腖","胪":"臚","胫":"脛","胶":"膠","脉":"脈","脍":"膾","脏":"髒","脐":"臍","脑":"腦","脓":"膿","脔":"臠","脚":"腳","脱":"脫","脶":"腡","脸":"臉","腊":"臘","腌":"醃","腘":"膕","腭":"齶","腻":"膩","腼":"靦","腽":"膃","腾":"騰","膑":"臏","膻":"羶","臜":"臢","致":"致","舆":"輿","舍":"舍","舣":"艤","舰":"艦","舱":"艙","舻":"艫","艰":"艱","艳":"豔","艺":"藝","节":"節","芈":"羋","芗":"薌","芜":"蕪","芦":"蘆","芸":"芸","苁":"蓯","苇":"葦","苈":"藶","苋":"莧","苌":"萇","苍":"蒼","苎":"苧","苏":"蘇","苔":"苔","苧":"薴","苹":"蘋","范":"範","茎":"莖","茏":"蘢","茑":"蔦","茔":"塋","茕":"煢","茧":"繭","荆":"荊","荐":"薦","荙":"薘","荚":"莢","荛":"蕘","荜":"蓽","荝":"萴","荞":"蕎","荟":"薈","荠":"薺","荡":"蕩","荣":"榮","荤":"葷","荥":"滎","荦":"犖","荧":"熒","荨":"蕁","荩":"藎","荪":"蓀","荫":"蔭","荬":"蕒","荭":"葒","荮":"葤","药":"藥","莅":"蒞","莱":"萊","莲":"蓮","莳":"蒔","莴":"萵","莶":"薟","获":"獲","莸":"蕕","莹":"瑩","莺":"鶯","莼":"蓴","萚":"蘀","萝":"蘿","萤":"螢","营":"營","萦":"縈","萧":"蕭","萨":"薩","葱":"蔥","蒀":"蒕","蒇":"蕆","蒉":"蕢","蒋":"蔣","蒌":"蔞","蒏":"醟","蒙":"蒙","蓝":"藍","蓟":"薊","蓠":"蘺","蓣":"蕷","蓥":"鎣","蓦":"驀","蔂":"虆","蔑":"蔑","蔷":"薔","蔹":"蘞","蔺":"藺","蔼":"藹","蕰":"薀","蕲":"蘄","蕴":"蘊","薮":"藪","藓":"蘚","藴":"蘊","蘖":"櫱","虏":"虜","虑":"慮","虚":"虛","虫":"蟲","虬":"虯","虮":"蟣","虱":"蝨","虽":"雖","虾":"蝦","虿":"蠆","蚀":"蝕","蚁":"蟻","蚂":"螞","蚃":"蠁","蚕":"蠶","蚝":"蠔","蚬":"蜆","蛊":"蠱","蛎":"蠣","蛏":"蟶","蛮":"蠻","蛰":"蟄","蛱":"蛺","蛲":"蟯","蛳":"螄","蛴":"蠐","蜕":"蛻","蜗":"蝸","蜡":"蠟","蝇":"蠅","蝈":"蟈","蝉":"蟬","蝎":"蠍","蝼":"螻","蝾":"蠑","螀":"螿","螨":"蟎","蟏":"蠨","衅":"釁","衔":"銜","补":"補","表":"表","衬":"襯","衮":"袞","袄":"襖","袅":"嫋","袆":"褘","袜":"襪","袭":"襲","袯":"襏","装":"裝","裆":"襠","裈":"褌","裢":"褳","裣":"襝","裤":"褲","裥":"襉","褛":"褸","褴":"襤","襕":"襴","见":"見","观":"觀","觃":"覎","规":"規","觅":"覓","视":"視","觇":"覘","览":"覽","觉":"覺","觊":"覬","觋":"覡","觌":"觿","觍":"覥","觎":"覦","觏":"覯","觐":"覲","觑":"覷","觞":"觴","触":"觸","觯":"觶","訚":"誾","詟":"讋","誉":"譽","誊":"謄","讠":"訁","计":"計","订":"訂","讣":"訃","认":"認","讥":"譏","讦":"訐","讧":"訌","讨":"討","让":"讓","讪":"訕","讫":"訖","讬":"託","训":"訓","议":"議","讯":"訊","记":"記","讱":"訒","讲":"講","讳":"諱","讴":"謳","讵":"詎","讶":"訝","讷":"訥","许":"許","讹":"訛","论":"論","讻":"訩","讼":"訟","讽":"諷","设":"設","访":"訪","诀":"訣","证":"證","诂":"詁","诃":"訶","评":"評","诅":"詛","识":"識","诇":"詗","诈":"詐","诉":"訴","诊":"診","诋":"詆","诌":"謅","词":"詞","诎":"詘","诏":"詔","诐":"詖","译":"譯","诒":"詒","诓":"誆","诔":"誄","试":"試","诖":"詿","诗":"詩","诘":"詰","诙":"詼","诚":"誠","诛":"誅","诜":"詵","话":"話","诞":"誕","诟":"詬","诠":"詮","诡":"詭","询":"詢","诣":"詣","诤":"諍","该":"該","详":"詳","诧":"詫","诨":"諢","诩":"詡","诪":"譸","诫":"誡","诬":"誣","语":"語","诮":"誚","误":"誤","诰":"誥","诱":"誘","诲":"誨","诳":"誑","说":"說","诵":"誦","诶":"誒","请":"請","诸":"諸","诹":"諏","诺":"諾","读":"讀","诼":"諑","诽":"誹","课":"課","诿":"諉","谀":"諛","谁":"誰","谂":"諗","调":"調","谄":"諂","谅":"諒","谆":"諄","谇":"誶","谈":"談","谉":"讅","谊":"誼","谋":"謀","谌":"諶","谍":"諜","谎":"謊","谏":"諫","谐":"諧","谑":"謔","谒":"謁","谓":"謂","谔":"諤","谕":"諭","谖":"諼","谗":"讒","谘":"諮","谙":"諳","谚":"諺","谛":"諦","谜":"謎","谝":"諞","谞":"諝","谟":"謨","谠":"讜","谡":"謖","谢":"謝","谣":"謠","谤":"謗","谥":"諡","谦":"謙","谧":"謐","谨":"謹","谩":"謾","谪":"謫","谫":"譾","谬":"謬","谭":"譚","谮":"譖","谯":"譙","谰":"讕","谱":"譜","谲":"譎","谳":"讞","谴":"譴","谵":"譫","谶":"讖","谷":"谷","豮":"豶","贝":"貝","贞":"貞","负":"負","贠":"貟","贡":"貢","财":"財","责":"責","贤":"賢","败":"敗","账":"賬","货":"貨","质":"質","贩":"販","贪":"貪","贫":"貧","贬":"貶","购":"購","贮":"貯","贯":"貫","贰":"貳","贱":"賤","贲":"賁","贳":"貰","贴":"貼","贵":"貴","贶":"貺","贷":"貸","贸":"貿","费":"費","贺":"賀","贻":"貽","贼":"賊","贽":"贄","贾":"賈","贿":"賄","赀":"貲","赁":"賃","赂":"賂","赃":"贓","资":"資","赅":"賅","赆":"贐","赇":"賕","赈":"賑","赉":"賚","赊":"賒","赋":"賦","赌":"賭","赍":"齎","赎":"贖","赏":"賞","赐":"賜","赑":"贔","赒":"賙","赓":"賡","赔":"賠","赕":"賧","赖":"賴","赗":"賵","赘":"贅","赙":"賻","赚":"賺","赛":"賽","赜":"賾","赝":"贗","赞":"贊","赟":"贇","赠":"贈","赡":"贍","赢":"贏","赣":"贛","赪":"赬","赵":"趙","赶":"趕","趋":"趨","趱":"趲","趸":"躉","跃":"躍","跄":"蹌","跖":"蹠","跞":"躒","践":"踐","跶":"躂","跷":"蹺","跸":"蹕","跹":"躚","跻":"躋","踌":"躊","踪":"蹤","踬":"躓","踯":"躑","蹑":"躡","蹒":"蹣","蹰":"躕","蹿":"躥","躏":"躪","躜":"躦","躯":"軀","輼":"轀","车":"車","轧":"軋","轨":"軌","轩":"軒","轪":"軑","轫":"軔","转":"轉","轭":"軛","轮":"輪","软":"軟","轰":"轟","轱":"軲","轲":"軻","轳":"轤","轴":"軸","轵":"軹","轶":"軼","轷":"軤","轸":"軫","轹":"轢","轺":"軺","轻":"輕","轼":"軾","载":"載","轾":"輊","轿":"轎","辀":"輈","辁":"輇","辂":"輅","较":"較","辄":"輒","辅":"輔","辆":"輛","辇":"輦","辈":"輩","辉":"輝","辊":"輥","辋":"輞","辌":"輬","辍":"輟","辎":"輜","辏":"輳","辐":"輻","辑":"輯","辒":"轀","输":"輸","辔":"轡","辕":"轅","辖":"轄","辗":"輾","辘":"轆","辙":"轍","辚":"轔","辞":"辭","辟":"闢","辩":"辯","辫":"辮","边":"邊","辽":"遼","达":"達","迁":"遷","过":"過","迈":"邁","运":"運","还":"還","这":"這","进":"進","远":"遠","违":"違","连":"連","迟":"遲","迩":"邇","迳":"逕","迹":"跡","适":"適","选":"選","逊":"遜","递":"遞","逦":"邐","逻":"邏","遗":"遺","遥":"遙","邓":"鄧","邝":"鄺","邬":"鄔","邮":"郵","邹":"鄒","邺":"鄴","邻":"鄰","郁":"鬱","郏":"郟","郐":"鄶","郑":"鄭","郓":"鄆","郦":"酈","郧":"鄖","郸":"鄲","酂":"酇","酝":"醞","酦":"醱","酱":"醬","酸":"酸","酽":"釅","酾":"釃","酿":"釀","醖":"醞","采":"採","释":"釋","里":"裏","鉴":"鑑","銮":"鑾","錾":"鏨","钅":"釒","钆":"釓","钇":"釔","针":"針","钉":"釘","钊":"釗","钋":"釙","钌":"釕","钍":"釷","钎":"釺","钏":"釧","钐":"釤","钑":"鈒","钒":"釩","钓":"釣","钔":"鍆","钕":"釹","钖":"鍚","钗":"釵","钘":"鈃","钙":"鈣","钚":"鈈","钛":"鈦","钜":"鉅","钝":"鈍","钞":"鈔","钟":"鍾","钠":"鈉","钡":"鋇","钢":"鋼","钣":"鈑","钤":"鈐","钥":"鑰","钦":"欽","钧":"鈞","钨":"鎢","钩":"鉤","钪":"鈧","钫":"鈁","钬":"鈥","钭":"鈄","钮":"鈕","钯":"鈀","钰":"鈺","钱":"錢","钲":"鉦","钳":"鉗","钴":"鈷","钵":"鉢","钶":"鈳","钷":"鉕","钸":"鈽","钹":"鈸","钺":"鉞","钻":"鑽","钼":"鉬","钽":"鉭","钾":"鉀","钿":"鈿","铀":"鈾","铁":"鐵","铂":"鉑","铃":"鈴","铄":"鑠","铅":"鉛","铆":"鉚","铇":"鉋","铈":"鈰","铉":"鉉","铊":"鉈","铋":"鉍","铌":"鈮","铍":"鈹","铎":"鐸","铏":"鉶","铐":"銬","铑":"銠","铒":"鉺","铓":"鋩","铔":"錏","铕":"銪","铖":"鋮","铗":"鋏","铘":"鋣","铙":"鐃","铚":"銍","铛":"鐺","铜":"銅","铝":"鋁","铞":"銱","铟":"銦","铠":"鎧","铡":"鍘","铢":"銖","铣":"銑","铤":"鋌","铥":"銩","铦":"銛","铧":"鏵","铨":"銓","铩":"鎩","铪":"鉿","铫":"銚","铬":"鉻","铭":"銘","铮":"錚","铯":"銫","铰":"鉸","铱":"銥","铲":"鏟","铳":"銃","铴":"鐋","铵":"銨","银":"銀","铷":"銣","铸":"鑄","铹":"鐒","铺":"鋪","铻":"鋙","铼":"錸","铽":"鋱","链":"鏈","铿":"鏗","销":"銷","锁":"鎖","锂":"鋰","锃":"鋥","锄":"鋤","锅":"鍋","锆":"鋯","锇":"鋨","锈":"鏽","锉":"銼","锊":"鋝","锋":"鋒","锌":"鋅","锍":"鋶","锎":"鐦","锏":"鐧","锐":"銳","锑":"銻","锒":"鋃","锓":"鋟","锔":"鋦","锕":"錒","锖":"錆","锗":"鍺","锘":"鍩","错":"錯","锚":"錨","锛":"錛","锜":"錡","锝":"鍀","锞":"錁","锟":"錕","锠":"錩","锡":"錫","锢":"錮","锣":"鑼","锤":"錘","锥":"錐","锦":"錦","锧":"鑕","锨":"鍁","锩":"錈","锪":"鍃","锫":"錇","锬":"錟","锭":"錠","键":"鍵","锯":"鋸","锰":"錳","锱":"錙","锲":"鍥","锳":"鍈","锴":"鍇","锵":"鏘","锶":"鍶","锷":"鍔","锸":"鍤","锹":"鍬","锺":"鍾","锻":"鍛","锼":"鎪","锽":"鍠","锾":"鍰","锿":"鎄","镀":"鍍","镁":"鎂","镂":"鏤","镃":"鎡","镄":"鐨","镅":"鎇","镆":"鏌","镇":"鎮","镈":"鎛","镉":"鎘","镊":"鑷","镋":"钂","镌":"鐫","镍":"鎳","镎":"鎿","镏":"鎦","镐":"鎬","镑":"鎊","镒":"鎰","镓":"鎵","镔":"鑌","镕":"鎔","镖":"鏢","镗":"鏜","镘":"鏝","镙":"鏍","镚":"鏰","镛":"鏞","镜":"鏡","镝":"鏑","镞":"鏃","镟":"鏇","镠":"鏐","镡":"鐔","镢":"钁","镣":"鐐","镤":"鏷","镥":"鑥","镦":"鐓","镧":"鑭","镨":"鐠","镩":"鑹","镪":"鏹","镫":"鐙","镬":"鑊","镭":"鐳","镮":"鐶","镯":"鐲","镰":"鐮","镱":"鐿","镲":"鑔","镳":"鑣","镴":"鑞","镵":"鑱","镶":"鑲","长":"長","门":"門","闩":"閂","闪":"閃","闫":"閆","闬":"閈","闭":"閉","问":"問","闯":"闖","闰":"閏","闱":"闈","闲":"閒","闳":"閎","间":"間","闵":"閔","闶":"閌","闷":"悶","闸":"閘","闹":"鬧","闺":"閨","闻":"聞","闼":"闥","闽":"閩","闾":"閭","闿":"闓","阀":"閥","阁":"閣","阂":"閡","阃":"閫","阄":"鬮","阅":"閱","阆":"閬","阇":"闍","阈":"閾","阉":"閹","阊":"閶","阋":"鬩","阌":"閿","阍":"閽","阎":"閻","阏":"閼","阐":"闡","阑":"闌","阒":"闃","阓":"闠","阔":"闊","阕":"闋","阖":"闔","阗":"闐","阘":"闒","阙":"闕","阚":"闞","阛":"闤","队":"隊","阳":"陽","阴":"陰","阵":"陣","阶":"階","际":"際","陆":"陸","陇":"隴","陈":"陳","陉":"陘","陕":"陝","陦":"隯","陧":"隉","陨":"隕","险":"險","随":"隨","隐":"隱","隶":"隸","隽":"雋","难":"難","雇":"僱","雏":"雛","雕":"雕","雠":"讎","雳":"靂","雾":"霧","霁":"霽","霉":"黴","霡":"霢","霭":"靄","靓":"靚","靔":"靝","静":"靜","面":"面","靥":"靨","鞑":"韃","鞒":"鞽","鞯":"韉","鞲":"韝","韦":"韋","韧":"韌","韨":"韍","韩":"韓","韪":"韙","韫":"韞","韬":"韜","韵":"韻","页":"頁","顶":"頂","顷":"頃","顸":"頇","项":"項","顺":"順","须":"須","顼":"頊","顽":"頑","顾":"顧","顿":"頓","颀":"頎","颁":"頒","颂":"頌","颃":"頏","预":"預","颅":"顱","领":"領","颇":"頗","颈":"頸","颉":"頡","颊":"頰","颋":"頲","颌":"頜","颍":"潁","颎":"熲","颏":"頦","颐":"頤","频":"頻","颒":"頮","颓":"頹","颔":"頷","颕":"頴","颖":"穎","颗":"顆","题":"題","颙":"顒","颚":"顎","颛":"顓","颜":"顏","额":"額","颞":"顳","颟":"顢","颠":"顛","颡":"顙","颢":"顥","颣":"纇","颤":"顫","颥":"顬","颦":"顰","颧":"顴","风":"風","飏":"颺","飐":"颭","飑":"颮","飒":"颯","飓":"颶","飔":"颸","飕":"颼","飖":"颻","飗":"飀","飘":"飄","飙":"飆","飚":"飈","飞":"飛","飨":"饗","餍":"饜","饣":"飠","饤":"飣","饥":"飢","饦":"飥","饧":"餳","饨":"飩","饩":"餼","饪":"飪","饫":"飫","饬":"飭","饭":"飯","饮":"飲","饯":"餞","饰":"飾","饱":"飽","饲":"飼","饳":"飿","饴":"飴","饵":"餌","饶":"饒","饷":"餉","饸":"餄","饹":"餎","饺":"餃","饻":"餏","饼":"餅","饽":"餑","饾":"餖","饿":"餓","馀":"餘","馁":"餒","馂":"餕","馃":"餜","馄":"餛","馅":"餡","馆":"館","馇":"餷","馈":"饋","馉":"餶","馊":"餿","馋":"饞","馌":"饁","馍":"饃","馎":"餺","馏":"餾","馐":"饈","馑":"饉","馒":"饅","馓":"饊","馔":"饌","馕":"饢","马":"馬","驭":"馭","驮":"馱","驯":"馴","驰":"馳","驱":"驅","驲":"馹","驳":"駁","驴":"驢","驵":"駔","驶":"駛","驷":"駟","驸":"駙","驹":"駒","驺":"騶","驻":"駐","驼":"駝","驽":"駑","驾":"駕","驿":"驛","骀":"駘","骁":"驍","骂":"罵","骃":"駰","骄":"驕","骅":"驊","骆":"駱","骇":"駭","骈":"駢","骉":"驫","骊":"驪","骋":"騁","验":"驗","骍":"騂","骎":"駸","骏":"駿","骐":"騏","骑":"騎","骒":"騍","骓":"騅","骔":"騌","骕":"驌","骖":"驂","骗":"騙","骘":"騭","骙":"騤","骚":"騷","骛":"騖","骜":"驁","骝":"騮","骞":"騫","骟":"騸","骠":"驃","骡":"騾","骢":"驄","骣":"驏","骤":"驟","骥":"驥","骦":"驦","骧":"驤","髅":"髏","髋":"髖","髌":"髕","鬓":"鬢","鬶":"鬹","魇":"魘","魉":"魎","鱼":"魚","鱽":"魛","鱾":"魢","鱿":"魷","鲀":"魨","鲁":"魯","鲂":"魴","鲃":"䰾","鲄":"魺","鲅":"鮁","鲆":"鮃","鲇":"鮎","鲈":"鱸","鲉":"鮋","鲊":"鮓","鲋":"鮒","鲌":"鮊","鲍":"鮑","鲎":"鱟","鲏":"鮍","鲐":"鮐","鲑":"鮭","鲒":"鮚","鲓":"鮳","鲔":"鮪","鲕":"鮞","鲖":"鮦","鲗":"鰂","鲘":"鮜","鲙":"鱠","鲚":"鱭","鲛":"鮫","鲜":"鮮","鲝":"鮺","鲞":"鯗","鲟":"鱘","鲠":"鯁","鲡":"鱺","鲢":"鰱","鲣":"鰹","鲤":"鯉","鲥":"鰣","鲦":"鰷","鲧":"鯀","鲨":"鯊","鲩":"鯇","鲪":"鮶","鲫":"鯽","鲬":"鯒","鲭":"鯖","鲮":"鯪","鲯":"鯕","鲰":"鯫","鲱":"鯡","鲲":"鯤","鲳":"鯧","鲴":"鯝","鲵":"鯢","鲶":"鯰","鲷":"鯛","鲸":"鯨","鲹":"鰺","鲺":"鯴","鲻":"鯔","鲼":"鱝","鲽":"鰈","鲾":"鰏","鲿":"鱨","鳀":"鯷","鳁":"鰮","鳂":"鰃","鳃":"鰓","鳄":"鱷","鳅":"鰍","鳆":"鰒","鳇":"鰉","鳈":"鰁","鳉":"鱂","鳊":"鯿","鳋":"鰠","鳌":"鰲","鳍":"鰭","鳎":"鰨","鳏":"鰥","鳐":"鰩","鳑":"鰟","鳒":"鰜","鳓":"鰳","鳔":"鰾","鳕":"鱈","鳖":"鱉","鳗":"鰻","鳘":"鰵","鳙":"鱅","鳚":"䲁","鳛":"鰼","鳜":"鱖","鳝":"鱔","鳞":"鱗","鳟":"鱒","鳠":"鱯","鳡":"鱤","鳢":"鱧","鳣":"鱣","鳤":"䲘","鸟":"鳥","鸠":"鳩","鸡":"雞","鸢":"鳶","鸣":"鳴","鸤":"鳲","鸥":"鷗","鸦":"鴉","鸧":"鶬","鸨":"鴇","鸩":"鴆","鸪":"鴣","鸫":"鶇","鸬":"鸕","鸭":"鴨","鸮":"鴞","鸯":"鴦","鸰":"鴒","鸱":"鴟","鸲":"鴝","鸳":"鴛","鸴":"鷽","鸵":"鴕","鸶":"鷥","鸷":"鷙","鸸":"鴯","鸹":"鴰","鸺":"鵂","鸻":"鴴","鸼":"鵃","鸽":"鴿","鸾":"鸞","鸿":"鴻","鹀":"鵐","鹁":"鵓","鹂":"鸝","鹃":"鵑","鹄":"鵠","鹅":"鵝","鹆":"鵒","鹇":"鷳","鹈":"鵜","鹉":"鵡","鹊":"鵲","鹋":"鶓","鹌":"鵪","鹍":"鵾","鹎":"鵯","鹏":"鵬","鹐":"鵮","鹑":"鶉","鹒":"鶊","鹓":"鵷","鹔":"鷫","鹕":"鶘","鹖":"鶡","鹗":"鶚","鹘":"鶻","鹙":"鶖","鹚":"鷀","鹛":"鶥","鹜":"鶩","鹝":"鷊","鹞":"鷂","鹟":"鶲","鹠":"鶹","鹡":"鶺","鹢":"鷁","鹣":"鶼","鹤":"鶴","鹥":"鷖","鹦":"鸚","鹧":"鷓","鹨":"鷚","鹩":"鷯","鹪":"鷦","鹫":"鷲","鹬":"鷸","鹭":"鷺","鹮":"䴉","鹯":"鸇","鹰":"鷹","鹱":"鸌","鹲":"鸏","鹳":"鸛","鹴":"鸘","鹾":"鹺","麦":"麥","麸":"麩","麹":"麴","麺":"麪","麽":"麼","黄":"黃","黉":"黌","黡":"黶","黩":"黷","黪":"黲","黾":"黽","鼋":"黿","鼌":"鼂","鼍":"鼉","鼹":"鼴","齐":"齊","齑":"齏","齿":"齒","龀":"齔","龁":"齕","龂":"齗","龃":"齟","龄":"齡","龅":"齙","龆":"齠","龇":"齜","龈":"齦","龉":"齬","龊":"齪","龋":"齲","龌":"齷","龙":"龍","龚":"龔","龛":"龕","龟":"龜","鿎":"䃮","鿏":"䥑","鿒":"鿓","鿔":"鎶","𠀾":"𠁞","𠆲":"儣","𠆿":"𠌥","𠇹":"俓","𠉂":"㒓","𠉗":"𠏢","𠋆":"儭","𠚳":"𠠎","𠛅":"剾","𠛆":"𠞆","𠛾":"𪟖","𠡠":"勑","𠮶":"嗰","𠯟":"哯","𠯠":"噅","𠰱":"㘉","𠰷":"嚧","𠱞":"囃","𠲥":"𡅏","𠴛":"𡃕","𠴢":"𡄔","𠵸":"𡄣","𠵾":"㗲","𡋀":"𡓾","𡋗":"𡑭","𡋤":"壗","𡍣":"𡔖","𡒄":"壈","𡝠":"㜷","𡞋":"㜗","𡞱":"㜢","𡠟":"孎","𡥧":"孻","𡭜":"𡮉","𡭬":"𡮣","𡳃":"𡳳","𡳒":"𦘧","𡶴":"嵼","𡸃":"𡽗","𡺃":"嶈","𡺄":"嶘","𢋈":"㢝","𢗓":"㦛","𢘙":"𢤱","𢘝":"𢣚","𢘞":"𢣭","𢙏":"愻","𢙐":"憹","𢙑":"𢠼","𢙒":"憢","𢙓":"懀","𢛯":"㦎","𢠁":"懎","𢢐":"𤢻","𢧐":"戰","𢫊":"𢷮","𢫞":"𢶫","𢫬":"摋","𢬍":"擫","𢬦":"𢹿","𢭏":"擣","𢽾":"斅","𣃁":"斸","𣆐":"曥","𣈣":"𣋋","𣍨":"𦢈","𣍯":"腪","𣍰":"脥","𣎑":"臗","𣏢":"槫","𣐕":"桱","𣐤":"欍","𣑶":"𣠲","𣒌":"楇","𣓿":"橯","𣔌":"樤","𣗊":"樠","𣗋":"欓","𣗙":"㰙","𣘐":"㯤","𣘓":"𣞻","𣘴":"檭","𣘷":"𣝕","𣚚":"欘","𣞎":"𣠩","𣨼":"殢","𣭤":"𣯴","𣯣":"𣯩","𣱝":"氭","𣲗":"湋","𣲘":"潕","𣳆":"㵗","𣶩":"澅","𣶫":"𣿉","𣶭":"𪷓","𣷷":"𤅶","𣸣":"濆","𣺼":"灙","𣺽":"𤁣","𣽷":"瀃","𤆡":"熓","𤆢":"㷍","𤇃":"爄","𤇄":"熌","𤇭":"爖","𤇹":"熚","𤈶":"熉","𤈷":"㷿","𤊀":"𤒎","𤊰":"𤓩","𤋏":"熡","𤎺":"𤓎","𤎻":"𤑳","𤙯":"𤛮","𤝢":"𤢟","𤞃":"獩","𤞤":"玁","𤠋":"㺏","𤦀":"瓕","𤩽":"瓛","𤳄":"𤳸","𤶊":"癐","𤶧":"𤸫","𤻊":"㿗","𤽯":"㿧","𤾀":"皟","𤿲":"麬","𥁢":"䀉","𥅘":"𥌃","𥅴":"䀹","𥅿":"𥊝","𥆧":"瞤","𥇢":"䁪","𥎝":"䂎","𥐟":"礒","𥐯":"𥖅","𥐰":"𥕥","𥐻":"碙","𥞦":"𥞵","𥧂":"𥨐","𥩟":"竚","𥩺":"𥪂","𥫣":"籅","𥬀":"䉙","𥬞":"籋","𥬠":"篘","𥭉":"𥵊","𥮋":"𥸠","𥮜":"䉲","𥮾":"篸","𥱔":"𥵃","𥹥":"𥼽","𥺅":"䊭","𥺇":"𥽖","𦈈":"𥿊","𦈉":"緷","𦈋":"綇","𦈌":"綀","𦈎":"繟","𦈏":"緍","𦈐":"縺","𦈑":"緸","𦈒":"𦂅","𦈓":"䋿","𦈔":"縎","𦈕":"緰","𦈖":"䌈","𦈗":"𦃄","𦈘":"䌋","𦈙":"䌰","𦈚":"縬","𦈛":"繓","𦈜":"䌖","𦈝":"繏","𦈞":"䌟","𦈟":"䌝","𦈠":"䌥","𦈡":"繻","𦍠":"䍽","𦛨":"朥","𦝼":"膢","𦟗":"𦣎","𦨩":"𦪽","𦰏":"蓧","𦰴":"䕳","𦶟":"爇","𦶻":"𦾟","𦻕":"蘟","𧉐":"𧕟","𧉞":"䗿","𧌥":"𧎈","𧏖":"蠙","𧏗":"蠀","𧑏":"蠾","𧒭":"𧔥","𧜭":"䙱","𧝝":"襰","𧝧":"𧟀","𧮪":"詀","𧳕":"𧳟","𧹑":"䞈","𧹒":"買","𧹓":"𧶔","𧹔":"賬","𧹕":"𝻻","𧹖":"賟","𧹗":"贃","𧿈":"𨇁","𨀁":"躘","𨀱":"𨄣","𨁴":"𨅍","𨂺":"𨈊","𨄄":"𨈌","𨅛":"䠱","𨅫":"𨇞","𨅬":"躝","𨉗":"軉","𨐅":"軗","𨐆":"𨊻","𨐇":"𨏠","𨐈":"輄","𨐉":"𨎮","𨐊":"𨏥","𨑹":"䢨","𨟳":"𨣞","𨠨":"𨣧","𨡙":"𨢿","𨡺":"𨣈","𨤰":"𨤻","𨰾":"鎷","𨰿":"釳","𨱀":"𨥛","𨱁":"鈠","𨱂":"鈋","𨱃":"鈲","𨱄":"鈯","𨱅":"鉁","𨱆":"龯","𨱇":"銶","𨱈":"鋉","𨱉":"鍄","𨱊":"𨧱","𨱋":"錂","𨱌":"鏆","𨱍":"鎯","𨱎":"鍮","𨱏":"鎝","𨱐":"𨫒","𨱑":"鐄","𨱒":"鏉","𨱓":"鐎","𨱔":"鐏","𨱕":"𨮂","𨱖":"䥩","𨷿":"䦳","𨸀":"𨳕","𨸁":"𨳑","𨸂":"閍","𨸃":"閐","𨸄":"䦘","𨸅":"𨴗","𨸆":"𨵩","𨸇":"𨵸","𨸉":"𨶀","𨸊":"𨶏","𨸋":"𨶲","𨸌":"𨶮","𨸎":"𨷲","𨸘":"𨽏","𨸟":"䧢","𩏼":"䪏","𩏽":"𩏪","𩏾":"𩎢","𩏿":"䪘","𩐀":"䪗","𩓋":"顂","𩖕":"𩓣","𩖖":"顃","𩖗":"䫴","𩙥":"颰","𩙦":"𩗀","𩙧":"䬞","𩙨":"𩘹","𩙩":"𩘀","𩙪":"颷","𩙫":"颾","𩙬":"𩘺","𩙭":"𩘝","𩙮":"䬘","𩙯":"䬝","𩙰":"𩙈","𩟿":"𩚛","𩠀":"𩚥","𩠁":"𩚵","𩠂":"𩛆","𩠃":"𩛩","𩠅":"𩟐","𩠆":"𩜦","𩠇":"䭀","𩠈":"䭃","𩠉":"𩜇","𩠊":"𩜵","𩠋":"𩝔","𩠌":"餸","𩠎":"𩞄","𩠏":"𩞦","𩠠":"𩠴","𩡖":"𩡣","𩧦":"𩡺","𩧨":"駎","𩧩":"𩤊","𩧪":"䮾","𩧫":"駚","𩧬":"𩢡","𩧭":"䭿","𩧮":"𩢾","𩧯":"驋","𩧰":"䮝","𩧱":"𩥉","𩧲":"駧","𩧳":"𩢸","𩧴":"駩","𩧵":"𩢴","𩧶":"𩣏","𩧸":"𩣫","𩧺":"駶","𩧻":"𩣵","𩧼":"𩣺","𩧿":"䮠","𩨀":"騔","𩨁":"䮞","𩨂":"驄","𩨃":"騝","𩨄":"騪","𩨅":"𩤸","𩨆":"𩤙","𩨇":"䮫","𩨈":"騟","𩨉":"𩤲","𩨊":"騚","𩨋":"𩥄","𩨌":"𩥑","𩨍":"𩥇","𩨎":"龭","𩨏":"䮳","𩨐":"𩧆","𩩈":"䯤","𩬣":"𩭙","𩬤":"𩰀","𩭹":"鬖","𩯒":"𩯳","𩰰":"𩰹","𩲒":"𩳤","𩴌":"𩴵","𩽹":"魥","𩽺":"𩵩","𩽻":"𩵹","𩽼":"鯶","𩽽":"𩶱","𩽾":"鮟","𩽿":"𩶰","𩾁":"鯄","𩾂":"䲖","𩾃":"鮸","𩾄":"𩷰","𩾅":"𩸃","𩾆":"𩸦","𩾇":"鯱","𩾈":"䱙","𩾊":"䱬","𩾋":"䱰","𩾌":"鱇","𩾎":"𩽇","𪉂":"䲰","𪉃":"鳼","𪉄":"𩿪","𪉅":"𪀦","𪉆":"鴲","𪉈":"鴜","𪉉":"𪁈","𪉊":"鷨","𪉋":"𪀾","𪉌":"𪁖","𪉍":"鵚","𪉎":"𪂆","𪉏":"𪃏","𪉐":"𪃍","𪉑":"鷔","𪉒":"𪄕","𪉔":"𪄆","𪉕":"𪇳","𪎈":"䴬","𪎉":"麲","𪎊":"麨","𪎋":"䴴","𪎌":"麳","𪑅":"䵳","𪔭":"𪔵","𪚏":"𪘀","𪚐":"𪘯","𪜎":"𠿕","𪞝":"凙","𪟎":"㔋","𪟝":"勣","𪠀":"𧷎","𪠟":"㓄","𪠡":"𠬙","𪠳":"唓","𪠵":"㖮","𪠸":"嚛","𪠺":"𠽃","𪠽":"噹","𪡀":"嘺","𪡃":"嘪","𪡋":"噞","𪡏":"嗹","𪡛":"㗿","𪡞":"嘳","𪡺":"𡃄","𪢌":"㘓","𪢐":"𡃤","𪢒":"𡂡","𪢕":"嚽","𪢖":"𡅯","𪢠":"囒","𪢮":"圞","𪢸":"墲","𪣆":"埬","𪣒":"堚","𪣻":"塿","𪤄":"𡓁","𪤚":"壣","𪥠":"𧹈","𪥫":"孇","𪥰":"嬣","𪥿":"嬻","𪧀":"孾","𪧘":"寠","𪨊":"㞞","𪨗":"屩","𪨧":"崙","𪨩":"𡸗","𪨶":"輋","𪨷":"巗","𪨹":"𡹬","𪩇":"㟺","𪩎":"巊","𪩘":"巘","𪩛":"𡿖","𪩷":"幝","𪩸":"幩","𪪏":"廬","𪪑":"㢗","𪪞":"廧","𪪴":"𢍰","𪪼":"彃","𪫌":"徿","𪫡":"𢤩","𪫷":"㦞","𪫺":"憸","𪬚":"𢣐","𪬯":"𢤿","𪭝":"𢯷","𪭢":"摐","𪭧":"擟","𪭯":"𢶒","𪭵":"掚","𪭾":"撊","𪮃":"㨻","𪮋":"㩋","𪮖":"撧","𪮳":"𢺳","𪮶":"攋","𪯋":"㪎","𪰶":"曊","𪱥":"膹","𪱷":"梖","𪲎":"櫅","𪲔":"欐","𪲛":"檵","𪲮":"櫠","𪳍":"欇","𪳗":"𣜬","𪴙":"欑","𪵑":"毊","𪵣":"霼","𪵱":"濿","𪶄":"溡","𪶒":"𤄷","𪶮":"𣽏","𪷍":"㵾","𪷽":"灒","𪸕":"熂","𪸩":"煇","𪹀":"𤑹","𪹠":"𤓌","𪹳":"爥","𪹹":"𤒻","𪺣":"𤘀","𪺪":"𤜆","𪺭":"犞","𪺷":"獊","𪺸":"𤠮","𪺻":"㺜","𪺽":"猌","𪻐":"瑽","𪻨":"瓄","𪻲":"瑻","𪻺":"璝","𪼋":"㻶","𪼴":"𤬅","𪽈":"畼","𪽝":"𤳷","𪽪":"痮","𪽭":"𤷃","𪽮":"㿖","𪽴":"𤺔","𪽷":"瘱","𪾔":"盨","𪾢":"睍","𪾣":"眝","𪾦":"矑","𪾸":"矉","𪿊":"𥏝","𪿞":"𥖲","𪿫":"礮","𪿵":"𥗇","𫀌":"𥜰","𫀓":"𥜐","𫀨":"䅐","𫀬":"䅳","𫀮":"𥢷","𫁂":"䆉","𫁟":"竱","𫁡":"鴗","𫁱":"𥶽","𫁲":"䉑","𫁳":"𥯤","𫁷":"䉶","𫁺":"𥴼","𫂃":"簢","𫂆":"簂","𫂈":"䉬","𫂖":"𥴨","𫂿":"𥻦","𫃗":"𩏷","𫄙":"糺","𫄚":"䊺","𫄛":"紟","𫄜":"䋃","𫄝":"𥾯","𫄞":"䋔","𫄟":"絁","𫄠":"絙","𫄡":"絧","𫄢":"絥","𫄣":"繷","𫄤":"繨","𫄥":"纚","𫄦":"𦀖","𫄧":"綖","𫄨":"絺","𫄩":"䋦","𫄪":"𦅇","𫄫":"綟","𫄬":"緤","𫄭":"緮","𫄮":"䋼","𫄯":"𦃩","𫄰":"縍","𫄱":"繬","𫄲":"縸","𫄳":"縰","𫄴":"繂","𫄵":"𦅈","𫄶":"繈","𫄷":"繶","𫄸":"纁","𫄹":"纗","𫅅":"䍤","𫅗":"羵","𫅥":"𦒀","𫅭":"䎙","𫅼":"𦔖","𫆏":"聻","𫆝":"𦟼","𫆫":"𦡝","𫇘":"𦧺","𫇛":"艣","𫇪":"𦱌","𫇭":"蔿","𫇴":"蒭","𫇽":"蕽","𫈉":"蕳","𫈎":"葝","𫈟":"蔯","𫈵":"蕝","𫉁":"薆","𫉄":"藷","𫊪":"䗅","𫊮":"蠦","𫊸":"蟜","𫊹":"𧒯","𫊻":"蟳","𫋇":"蟂","𫋌":"蟘","𫋲":"䙔","𫋷":"襗","𫋹":"襓","𫋻":"襘","𫌀":"襀","𫌇":"襵","𫌋":"𧞫","𫌨":"覼","𫌪":"覛","𫌫":"𧡴","𫌬":"𧢄","𫌭":"覹","𫌯":"䚩","𫍐":"𧭹","𫍙":"訑","𫍚":"訞","𫍛":"訜","𫍜":"詓","𫍝":"諫","𫍞":"𧦝","𫍟":"𧦧","𫍠":"䛄","𫍡":"詑","𫍢":"譊","𫍣":"詷","𫍤":"譑","𫍥":"誂","𫍦":"譨","𫍧":"誺","𫍨":"誫","𫍩":"諣","𫍪":"誋","𫍫":"䛳","𫍬":"誷","𫍭":"𧩕","𫍮":"誳","𫍯":"諴","𫍰":"諰","𫍱":"諯","𫍲":"謏","𫍳":"諥","𫍴":"謱","𫍵":"謸","𫍶":"𧩼","𫍷":"謉","𫍸":"謆","𫍹":"謯","𫍺":"𧫝","𫍻":"譆","𫍼":"𧬤","𫍽":"譞","𫍾":"𧭈","𫍿":"譾","𫎆":"豵","𫎌":"貗","𫎦":"贚","𫎧":"䝭","𫎨":"𧸘","𫎩":"賝","𫎪":"䞋","𫎫":"贉","𫎬":"贑","𫎭":"䞓","𫎱":"䟐","𫎳":"䟆","𫎸":"𧽯","𫎺":"䟃","𫏃":"䠆","𫏆":"蹳","𫏋":"蹻","𫏌":"𨂐","𫏐":"蹔","𫏑":"𨇽","𫏕":"𨆪","𫏞":"𨇰","𫏨":"𨇤","𫐄":"軏","𫐅":"軕","𫐆":"轣","𫐇":"軜","𫐈":"軷","𫐉":"軨","𫐊":"軬","𫐋":"𨎌","𫐌":"軿","𫐍":"𨌈","𫐎":"輢","𫐏":"輖","𫐐":"輗","𫐑":"輨","𫐒":"輷","𫐓":"輮","𫐔":"𨍰","𫐕":"轊","𫐖":"轇","𫐗":"轐","𫐘":"轗","𫐙":"轠","𫐷":"遱","𫑘":"鄟","𫑡":"鄳","𫑷":"醶","𫓥":"釟","𫓦":"釨","𫓧":"鈇","𫓨":"鈛","𫓩":"鏦","𫓪":"鈆","𫓫":"𨥟","𫓬":"鉔","𫓭":"鉠","𫓮":"𨪕","𫓯":"銈","𫓰":"銊","𫓱":"鐈","𫓲":"銁","𫓳":"𨰋","𫓴":"鉾","𫓵":"鋠","𫓶":"鋗","𫓷":"𫒡","𫓸":"錽","𫓹":"錤","𫓺":"鐪","𫓻":"錜","𫓼":"𨨛","𫓽":"錝","𫓾":"錥","𫓿":"𨨢","𫔀":"鍊","𫔁":"鐼","𫔂":"鍉","𫔃":"𨰲","𫔄":"鍒","𫔅":"鎍","𫔆":"䥯","𫔇":"鎞","𫔈":"鎙","𫔉":"𨰃","𫔊":"鏥","𫔋":"䥗","𫔌":"鏾","𫔍":"鐇","𫔎":"鐍","𫔏":"𨬖","𫔐":"𨭸","𫔑":"𨭖","𫔒":"𨮳","𫔓":"𨯟","𫔔":"鑴","𫔕":"𨰥","𫔖":"𨲳","𫔭":"開","𫔮":"閒","𫔯":"閗","𫔰":"閞","𫔲":"𨴹","𫔴":"閵","𫔵":"䦯","𫔶":"闑","𫔽":"𨼳","𫕚":"𩀨","𫕥":"霣","𫕨":"𩅙","𫖃":"靧","𫖅":"䪊","𫖇":"鞾","𫖑":"𩎖","𫖒":"韠","𫖓":"𩏂","𫖔":"韛","𫖕":"韝","𫖖":"𩏠","𫖪":"𩑔","𫖫":"䪴","𫖬":"䪾","𫖭":"𩒎","𫖮":"顗","𫖯":"頫","𫖰":"䫂","𫖱":"䫀","𫖲":"䫟","𫖳":"頵","𫖴":"𩔳","𫖵":"𩓥","𫖶":"顅","𫖷":"𩔑","𫖸":"願","𫖹":"顣","𫖺":"䫶","𫗇":"䫻","𫗈":"𩗓","𫗉":"𩗴","𫗊":"䬓","𫗋":"飋","𫗚":"𩟗","𫗞":"飦","𫗟":"䬧","𫗠":"餦","𫗡":"𩚩","𫗢":"飵","𫗣":"飶","𫗤":"𩛌","𫗥":"餫","𫗦":"餔","𫗧":"餗","𫗨":"𩛡","𫗩":"饠","𫗪":"餧","𫗫":"餬","𫗬":"餪","𫗭":"餵","𫗮":"餭","𫗯":"餱","𫗰":"䭔","𫗱":"䭑","𫗳":"𩝽","𫗴":"饘","𫗵":"饟","𫘛":"馯","𫘜":"馼","𫘝":"駃","𫘞":"駞","𫘟":"駊","𫘠":"駤","𫘡":"駫","𫘣":"駻","𫘤":"騃","𫘥":"騉","𫘦":"騊","𫘧":"騄","𫘨":"騠","𫘩":"騜","𫘪":"騵","𫘫":"騴","𫘬":"騱","𫘭":"騻","𫘮":"䮰","𫘯":"驓","𫘰":"驙","𫘱":"驨","𫘽":"鬠","𫙂":"𩯁","𫚈":"鱮","𫚉":"魟","𫚊":"鰑","𫚋":"鱄","𫚌":"魦","𫚍":"魵","𫚎":"𩶁","𫚏":"䱁","𫚐":"䱀","𫚑":"鮅","𫚒":"鮄","𫚓":"鮤","𫚔":"鮰","𫚕":"鰤","𫚖":"鮆","𫚗":"鮯","𫚘":"𩻮","𫚙":"鯆","𫚚":"鮿","𫚛":"鮵","𫚜":"䲅","𫚝":"𩸄","𫚞":"鯬","𫚟":"𩸡","𫚠":"䱧","𫚡":"鯞","𫚢":"鰋","𫚣":"鯾","𫚤":"鰦","𫚥":"鰕","𫚦":"鰫","𫚧":"鰽","𫚨":"𩻗","𫚩":"𩻬","𫚪":"鱊","𫚫":"鱢","𫚬":"𩼶","𫚭":"鱲","𫛚":"鳽","𫛛":"鳷","𫛜":"鴀","𫛝":"鴅","𫛞":"鴃","𫛟":"鸗","𫛠":"𩿤","𫛡":"鴔","𫛢":"鸋","𫛣":"鴥","𫛤":"鴐","𫛥":"鵊","𫛦":"鴮","𫛧":"𪀖","𫛨":"鵧","𫛩":"鴳","𫛪":"鴽","𫛫":"鶰","𫛬":"䳜","𫛭":"鵟","𫛮":"䳤","𫛯":"鶭","𫛰":"䳢","𫛱":"鵫","𫛲":"鵰","𫛳":"鵩","𫛴":"鷤","𫛵":"鶌","𫛶":"鶒","𫛷":"鶦","𫛸":"鶗","𫛹":"𪃧","𫛺":"䳧","𫛻":"𪃒","𫛼":"䳫","𫛽":"鷅","𫛾":"𪆷","𫜀":"鷐","𫜁":"鷩","𫜂":"𪅂","𫜃":"鷣","𫜄":"鷷","𫜅":"䴋","𫜊":"𪉸","𫜑":"麷","𫜒":"䴱","𫜓":"𪌭","𫜔":"䴽","𫜕":"𪍠","𫜙":"䵴","𫜟":"𪓰","𫜨":"𪶕","𫜩":"齧","𫜪":"齩","𫜫":"𫜦","𫜬":"齰","𫜭":"齭","𫜮":"齴","𫜯":"𪙏","𫜰":"齾","𫜲":"龓","𫜳":"䶲","𫝈":"㑮","𫝋":"𠐊","𫝦":"㛝","𫝧":"㜐","𫝨":"媈","𫝩":"嬦","𫝪":"𡟫","𫝫":"婡","𫝬":"嬇","𫝭":"孆","𫝮":"孄","𫝵":"嶹","𫞅":"𦠅","𫞗":"潣","𫞚":"澬","𫞛":"㶆","𫞝":"灍","𫞠":"爧","𫞡":"爃","𫞢":"𤛱","𫞣":"㹽","𫞥":"珼","𫞦":"璾","𫞧":"𤩂","𫞨":"璼","𫞩":"璊","𫞷":"𥢶","𫟃":"絍","𫟄":"綋","𫟅":"綡","𫟆":"緟","𫟇":"𦆲","𫟑":"䖅","𫟕":"䕤","𫟞":"訨","𫟟":"詊","𫟠":"譂","𫟡":"誴","𫟢":"䜖","𫟤":"䡐","𫟥":"䡩","𫟦":"䡵","𫟫":"𨞺","𫟬":"𨟊","𫟲":"釚","𫟳":"釲","𫟴":"鈖","𫟵":"鈗","𫟶":"銏","𫟷":"鉝","𫟸":"鉽","𫟹":"鉷","𫟺":"䤤","𫟻":"銂","𫟼":"鐽","𫟽":"𨧰","𫟾":"𨩰","𫟿":"鎈","𫠀":"䥄","𫠁":"鑉","𫠂":"閝","𫠅":"韚","𫠆":"頍","𫠇":"𩖰","𫠈":"䫾","𫠊":"䮄","𫠋":"騼","𫠌":"𩦠","𫠏":"𩵦","𫠐":"魽","𫠑":"䱸","𫠒":"鱆","𫠖":"𩿅","𫠜":"齯","𫢸":"僤","𫧃":"𣍐","𫧮":"𪋿","𫫇":"噁","𫬐":"㘔","𫭟":"塸","𫭢":"埨","𫭼":"𡑍","𫮃":"墠","𫰛":"娙","𫵷":"㠣","𫶇":"嵽","𫷷":"廞","𫸩":"彄","𬀩":"暐","𬀪":"晛","𬂩":"梜","𬃊":"櫍","𬇕":"澫","𬇙":"浿","𬇹":"漍","𬉼":"熰","𬊈":"燖","𬊤":"燀","𬍛":"瓅","𬍡":"璗","𬍤":"璕","𬒈":"礐","𬒗":"𥗽","𬕂":"篢","𬘓":"紃","𬘘":"紞","𬘡":"絪","𬘩":"綎","𬘫":"綄","𬘬":"綪","𬘭":"綝","𬘯":"綧","𬙂":"縯","𬙊":"纆","𬙋":"纕","𬜬":"蔄","𬜯":"䓣","𬞟":"蘋","𬟁":"虉","𬟽":"蝀","𬣙":"訏","𬣞":"詝","𬣡":"諓","𬣳":"詪","𬤇":"諲","𬤊":"諟","𬤝":"譓","𬨂":"軝","𬨎":"輶","𬩽":"鄩","𬪩":"醲","𬬩":"釴","𬬭":"錀","𬬮":"鋹","𬬱":"釿","𬬸":"鉥","𬬹":"鉮","𬬻":"鑪","𬬿":"鉊","𬭁":"鉧","𬭊":"𨧀","𬭎":"鋐","𬭚":"錞","𬭛":"𨨏","𬭤":"鍭","𬭩":"鎓","𬭬":"鏏","𬭭":"鏚","𬭯":"䥕","𬭳":"𨭎","𬭶":"𨭆","𬭸":"鏻","𬭼":"鐩","𬮱":"闉","𬮿":"隑","𬯀":"隮","𬯎":"隤","𬱖":"頔","𬱟":"頠","𬳵":"駓","𬳶":"駉","𬳽":"駪","𬳿":"駼","𬴂":"騑","𬴃":"騞","𬴊":"驎","𬶋":"鮈","𬶍":"鮀","𬶏":"鮠","𬶐":"鮡","𬶟":"鯻","𬶠":"鰊","𬶨":"鱀","𬶭":"鰶","𬶮":"鱚","𬷕":"鵏","𬸘":"鶠","𬸚":"鸑","𬸣":"鶱","𬸦":"鷟","𬸪":"鷭","𬸯":"鷿","𬹼":"齘","𬺈":"齮","𬺓":"齼","𰬸":"繐","𰰨":"菕","𰶎":"譅","𰾄":"鋂","𰾭":"鑀","𱊜":"𪈼"},t2sData={"㑮":"𫝈","㑯":"㑔","㑳":"㑇","㑶":"㐹","㒓":"𠉂","㓄":"𪠟","㓨":"刾","㔋":"𪟎","㖮":"𪠵","㗲":"𠵾","㗿":"𪡛","㘉":"𠰱","㘓":"𪢌","㘔":"𫬐","㘚":"㘎","㛝":"𫝦","㜄":"㚯","㜏":"㛣","㜐":"𫝧","㜗":"𡞋","㜢":"𡞱","㜷":"𡝠","㞞":"𪨊","㟺":"𪩇","㠏":"㟆","㠣":"𫵷","㢗":"𪪑","㢝":"𢋈","㥮":"㤘","㦎":"𢛯","㦛":"𢗓","㦞":"𪫷","㨻":"𪮃","㩋":"𪮋","㩜":"㨫","㩳":"㧐","㩵":"擜","㪎":"𪯋","㯤":"𣘐","㰙":"𣗙","㵗":"𣳆","㵾":"𪷍","㶆":"𫞛","㷍":"𤆢","㷿":"𤈷","㸇":"𤎺","㹽":"𫞣","㺏":"𤠋","㺜":"𪺻","㻶":"𪼋","㿖":"𪽮","㿗":"𤻊","㿧":"𤽯","䀉":"𥁢","䀹":"𥅴","䁪":"𥇢","䁻":"䀥","䂎":"𥎝","䃮":"鿎","䅐":"𫀨","䅳":"𫀬","䆉":"𫁂","䉑":"𫁲","䉙":"𥬀","䉬":"𫂈","䉲":"𥮜","䉶":"𫁷","䊭":"𥺅","䊷":"䌶","䊺":"𫄚","䋃":"𫄜","䋔":"𫄞","䋙":"䌺","䋚":"䌻","䋦":"𫄩","䋹":"䌿","䋻":"䌾","䋼":"𫄮","䋿":"𦈓","䌈":"𦈖","䌋":"𦈘","䌖":"𦈜","䌝":"𦈟","䌟":"𦈞","䌥":"𦈠","䌰":"𦈙","䍤":"𫅅","䍦":"䍠","䍽":"𦍠","䎙":"𫅭","䎱":"䎬","䓣":"𬜯","䕤":"𫟕","䕳":"𦰴","䖅":"𫟑","䗅":"𫊪","䗿":"𧉞","䙔":"𫋲","䙡":"䙌","䙱":"𧜭","䚩":"𫌯","䛄":"𫍠","䛳":"𫍫","䜀":"䜧","䜖":"𫟢","䝭":"𫎧","䝻":"𧹕","䝼":"䞍","䞈":"𧹑","䞋":"𫎪","䞓":"𫎭","䟃":"𫎺","䟆":"𫎳","䟐":"𫎱","䠆":"𫏃","䠱":"𨅛","䡐":"𫟤","䡩":"𫟥","䡵":"𫟦","䢨":"𨑹","䤤":"𫟺","䥄":"𫠀","䥇":"䦂","䥑":"鿏","䥕":"𬭯","䥗":"𫔋","䥩":"𨱖","䥯":"𫔆","䥱":"䥾","䦘":"𨸄","䦛":"䦶","䦟":"䦷","䦯":"𫔵","䦳":"𨷿","䧢":"𨸟","䪊":"𫖅","䪏":"𩏼","䪗":"𩐀","䪘":"𩏿","䪴":"𫖫","䪾":"𫖬","䫀":"𫖱","䫂":"𫖰","䫟":"𫖲","䫴":"𩖗","䫶":"𫖺","䫻":"𫗇","䫾":"𫠈","䬓":"𫗊","䬘":"𩙮","䬝":"𩙯","䬞":"𩙧","䬧":"𫗟","䭀":"𩠇","䭃":"𩠈","䭑":"𫗱","䭔":"𫗰","䭿":"𩧭","䮄":"𫠊","䮝":"𩧰","䮞":"𩨁","䮠":"𩧿","䮫":"𩨇","䮰":"𫘮","䮳":"𩨏","䮾":"𩧪","䯀":"䯅","䯤":"𩩈","䰾":"鲃","䱀":"𫚐","䱁":"𫚏","䱙":"𩾈","䱧":"𫚠","䱬":"𩾊","䱰":"𩾋","䱷":"䲣","䱸":"𫠑","䱽":"䲝","䲁":"鳚","䲅":"𫚜","䲖":"𩾂","䲘":"鳤","䲰":"𪉂","䳜":"𫛬","䳢":"𫛰","䳤":"𫛮","䳧":"𫛺","䳫":"𫛼","䴉":"鹮","䴋":"𫜅","䴬":"𪎈","䴱":"𫜒","䴴":"𪎋","䴽":"𫜔","䵳":"𪑅","䵴":"𫜙","䶕":"𫜨","䶲":"𫜳","丟":"丢","並":"并","乾":"干","亂":"乱","亙":"亘","亞":"亚","佇":"伫","佈":"布","佔":"占","併":"并","來":"来","侖":"仑","侶":"侣","侷":"局","俁":"俣","係":"系","俓":"𠇹","俔":"伣","俠":"侠","俥":"伡","俬":"私","倀":"伥","倆":"俩","倈":"俫","倉":"仓","個":"个","們":"们","倖":"幸","倫":"伦","倲":"㑈","偉":"伟","偑":"㐽","側":"侧","偵":"侦","偽":"伪","傌":"㐷","傑":"杰","傖":"伧","傘":"伞","備":"备","傢":"家","傭":"佣","傯":"偬","傳":"传","傴":"伛","債":"债","傷":"伤","傾":"倾","僂":"偻","僅":"仅","僉":"佥","僑":"侨","僕":"仆","僞":"伪","僤":"𫢸","僥":"侥","僨":"偾","僱":"雇","價":"价","儀":"仪","儁":"俊","儂":"侬","億":"亿","儈":"侩","儉":"俭","儎":"","儐":"","儔":"俦","儕":"侪","儘":"尽","償":"偿","儣":"𠆲","優":"优","儭":"𠋆","儲":"储","儷":"俪","儸":"㑩","儺":"傩","儻":"傥","儼":"俨","兇":"凶","兌":"兑","兒":"儿","兗":"兖","內":"内","兩":"两","冊":"册","冑":"胄","冪":"幂","凈":"净","凍":"冻","凙":"𪞝","凜":"凛","凱":"凯","別":"别","刪":"删","剄":"刭","則":"则","剋":"克","剎":"刹","剗":"刬","剛":"刚","剝":"剥","剮":"剐","剴":"剀","創":"创","剷":"铲","剾":"𠛅","劃":"划","劇":"剧","劉":"刘","劊":"刽","劌":"刿","劍":"剑","劏":"㓥","劑":"剂","劚":"㔉","勁":"劲","勑":"𠡠","動":"动","務":"务","勛":"勋","勝":"胜","勞":"劳","勢":"势","勣":"𪟝","勩":"勚","勱":"劢","勳":"勋","勵":"励","勸":"劝","勻":"匀","匭":"匦","匯":"汇","匱":"匮","區":"区","協":"协","卹":"恤","卻":"却","卽":"即","厙":"厍","厠":"厕","厤":"历","厭":"厌","厲":"厉","厴":"厣","參":"参","叄":"叁","叢":"丛","吒":"咤","吳":"吴","吶":"呐","呂":"吕","咼":"呙","員":"员","哯":"𠯟","唄":"呗","唓":"𪠳","唸":"念","問":"问","啓":"启","啞":"哑","啟":"启","啢":"唡","喎":"㖞","喚":"唤","喪":"丧","喫":"吃","喬":"乔","單":"单","喲":"哟","嗆":"呛","嗇":"啬","嗊":"唝","嗎":"吗","嗚":"呜","嗩":"唢","嗰":"𠮶","嗶":"哔","嗹":"𪡏","嘆":"叹","嘍":"喽","嘓":"啯","嘔":"呕","嘖":"啧","嘗":"尝","嘜":"唛","嘩":"哗","嘪":"𪡃","嘮":"唠","嘯":"啸","嘰":"叽","嘳":"𪡞","嘵":"哓","嘸":"呒","嘺":"𪡀","嘽":"啴","噁":"恶","噅":"𠯠","噓":"嘘","噚":"㖊","噝":"咝","噞":"𪡋","噠":"哒","噥":"哝","噦":"哕","噯":"嗳","噲":"哙","噴":"喷","噸":"吨","噹":"当","嚀":"咛","嚇":"吓","嚌":"哜","嚐":"尝","嚕":"噜","嚙":"啮","嚛":"𪠸","嚥":"咽","嚦":"呖","嚧":"𠰷","嚨":"咙","嚮":"向","嚲":"亸","嚳":"喾","嚴":"严","嚶":"嘤","嚽":"𪢕","囀":"啭","囁":"嗫","囂":"嚣","囃":"𠱞","囅":"冁","囈":"呓","囉":"啰","囌":"苏","囑":"嘱","囒":"𪢠","囪":"囱","圇":"囵","國":"国","圍":"围","園":"园","圓":"圆","圖":"图","團":"团","圞":"𪢮","垻":"坝","埡":"垭","埨":"𫭢","埬":"𪣆","埰":"采","執":"执","堅":"坚","堊":"垩","堖":"垴","堚":"𪣒","堝":"埚","堯":"尧","報":"报","場":"场","塊":"块","塋":"茔","塏":"垲","塒":"埘","塗":"涂","塚":"冢","塢":"坞","塤":"埙","塵":"尘","塸":"𫭟","塹":"堑","塿":"𪣻","墊":"垫","墜":"坠","墠":"𫮃","墮":"堕","墰":"坛","墲":"𪢸","墳":"坟","墶":"垯","墻":"墙","墾":"垦","壇":"坛","壈":"𡒄","壋":"垱","壎":"埙","壓":"压","壗":"𡋤","壘":"垒","壙":"圹","壚":"垆","壜":"坛","壞":"坏","壟":"垄","壠":"垅","壢":"坜","壣":"𪤚","壩":"坝","壪":"塆","壯":"壮","壺":"壶","壼":"壸","壽":"寿","夠":"够","夢":"梦","夥":"伙","夾":"夹","奐":"奂","奧":"奥","奩":"奁","奪":"夺","奬":"奖","奮":"奋","奼":"姹","妝":"妆","姍":"姗","姦":"奸","娙":"𫰛","娛":"娱","婁":"娄","婡":"𫝫","婦":"妇","婭":"娅","媈":"𫝨","媧":"娲","媯":"妫","媰":"㛀","媼":"媪","媽":"妈","嫋":"袅","嫗":"妪","嫵":"妩","嫺":"娴","嫻":"娴","嫿":"婳","嬀":"妫","嬃":"媭","嬇":"𫝬","嬈":"娆","嬋":"婵","嬌":"娇","嬙":"嫱","嬡":"嫒","嬣":"𪥰","嬤":"嬷","嬦":"𫝩","嬪":"嫔","嬰":"婴","嬸":"婶","嬻":"𪥿","孃":"娘","孄":"𫝮","孆":"𫝭","孇":"𪥫","孋":"㛤","孌":"娈","孎":"𡠟","孫":"孙","學":"学","孻":"𡥧","孾":"𪧀","孿":"孪","宮":"宫","寀":"采","寠":"𪧘","寢":"寝","實":"实","寧":"宁","審":"审","寫":"写","寬":"宽","寵":"宠","寶":"宝","將":"将","專":"专","尋":"寻","對":"对","導":"导","尷":"尴","屆":"届","屍":"尸","屓":"屃","屜":"屉","屢":"屡","層":"层","屨":"屦","屩":"𪨗","屬":"属","岡":"冈","峯":"峰","峴":"岘","島":"岛","峽":"峡","崍":"崃","崑":"昆","崗":"岗","崙":"仑","崢":"峥","崬":"岽","嵐":"岚","嵗":"岁","嵼":"𡶴","嵽":"𫶇","嵾":"㟥","嶁":"嵝","嶄":"崭","嶇":"岖","嶈":"𡺃","嶔":"嵚","嶗":"崂","嶘":"𡺄","嶠":"峤","嶢":"峣","嶧":"峄","嶨":"峃","嶮":"崄","嶸":"嵘","嶹":"𫝵","嶺":"岭","嶼":"屿","嶽":"岳","巊":"𪩎","巋":"岿","巒":"峦","巔":"巅","巖":"岩","巗":"𪨷","巘":"𪩘","巰":"巯","巹":"卺","帥":"帅","師":"师","帳":"帐","帶":"带","幀":"帧","幃":"帏","幓":"㡎","幗":"帼","幘":"帻","幝":"𪩷","幟":"帜","幣":"币","幩":"𪩸","幫":"帮","幬":"帱","幹":"干","幾":"几","庫":"库","廁":"厕","廂":"厢","廄":"厩","廈":"厦","廎":"庼","廕":"荫","廚":"厨","廝":"厮","廞":"𫷷","廟":"庙","廠":"厂","廡":"庑","廢":"废","廣":"广","廧":"𪪞","廩":"廪","廬":"庐","廳":"厅","弒":"弑","弔":"吊","弳":"弪","張":"张","強":"强","彃":"𪪼","彄":"𫸩","彆":"别","彈":"弹","彌":"弥","彎":"弯","彔":"录","彙":"汇","彠":"彟","彥":"彦","彫":"雕","彲":"彨","彷":"彷","彿":"佛","後":"后","徑":"径","從":"从","徠":"徕","復":"复","徵":"征","徹":"彻","徿":"𪫌","恆":"恒","恥":"耻","悅":"悦","悞":"悮","悵":"怅","悶":"闷","悽":"凄","惡":"恶","惱":"恼","惲":"恽","惻":"恻","愛":"爱","愜":"惬","愨":"悫","愴":"怆","愷":"恺","愻":"𢙏","愾":"忾","慄":"栗","態":"态","慍":"愠","慘":"惨","慚":"惭","慟":"恸","慣":"惯","慤":"悫","慪":"怄","慫":"怂","慮":"虑","慳":"悭","慶":"庆","慺":"㥪","慼":"戚","慾":"欲","憂":"忧","憊":"惫","憐":"怜","憑":"凭","憒":"愦","憖":"慭","憚":"惮","憢":"𢙒","憤":"愤","憫":"悯","憮":"怃","憲":"宪","憶":"忆","憸":"𪫺","憹":"𢙐","懀":"𢙓","懇":"恳","應":"应","懌":"怿","懍":"懔","懎":"𢠁","懞":"蒙","懟":"怼","懣":"懑","懤":"㤽","懨":"恹","懲":"惩","懶":"懒","懷":"怀","懸":"悬","懺":"忏","懼":"惧","懾":"慑","戀":"恋","戇":"戆","戔":"戋","戧":"戗","戩":"戬","戰":"战","戱":"戯","戲":"戏","戶":"户","拋":"抛","挩":"捝","挱":"挲","挾":"挟","捨":"舍","捫":"扪","捱":"挨","捲":"卷","掃":"扫","掄":"抡","掆":"㧏","掗":"挜","掙":"挣","掚":"𪭵","掛":"挂","採":"采","揀":"拣","揚":"扬","換":"换","揮":"挥","揯":"搄","損":"损","搖":"摇","搗":"捣","搵":"揾","搶":"抢","摋":"𢫬","摐":"𪭢","摑":"掴","摜":"掼","摟":"搂","摯":"挚","摳":"抠","摶":"抟","摺":"折","摻":"掺","撈":"捞","撊":"𪭾","撏":"挦","撐":"撑","撓":"挠","撝":"㧑","撟":"挢","撣":"掸","撥":"拨","撧":"𪮖","撫":"抚","撲":"扑","撳":"揿","撻":"挞","撾":"挝","撿":"捡","擁":"拥","擄":"掳","擇":"择","擊":"击","擋":"挡","擓":"㧟","擔":"担","據":"据","擟":"𪭧","擠":"挤","擣":"捣","擫":"𢬍","擬":"拟","擯":"摈","擰":"拧","擱":"搁","擲":"掷","擴":"扩","擷":"撷","擺":"摆","擻":"擞","擼":"撸","擽":"㧰","擾":"扰","攄":"摅","攆":"撵","攋":"𪮶","攏":"拢","攔":"拦","攖":"撄","攙":"搀","攛":"撺","攜":"携","攝":"摄","攢":"攒","攣":"挛","攤":"摊","攪":"搅","攬":"揽","敎":"教","敓":"敚","敗":"败","敘":"叙","敵":"敌","數":"数","斂":"敛","斃":"毙","斅":"𢽾","斆":"敩","斕":"斓","斬":"斩","斷":"断","斸":"𣃁","於":"于","旂":"旗","旣":"既","昇":"升","時":"时","晉":"晋","晛":"𬀪","晝":"昼","暈":"晕","暉":"晖","暐":"𬀩","暘":"旸","暢":"畅","暫":"暂","曄":"晔","曆":"历","曇":"昙","曉":"晓","曊":"𪰶","曏":"向","曖":"暧","曠":"旷","曥":"𣆐","曨":"昽","曬":"晒","書":"书","會":"会","朥":"𦛨","朧":"胧","朮":"术","東":"东","枴":"拐","柵":"栅","柺":"拐","査":"查","桱":"𣐕","桿":"杆","梔":"栀","梖":"𪱷","梘":"枧","梜":"𬂩","條":"条","梟":"枭","梲":"棁","棄":"弃","棊":"棋","棖":"枨","棗":"枣","棟":"栋","棡":"㭎","棧":"栈","棲":"栖","棶":"梾","椏":"桠","椲":"㭏","楇":"𣒌","楊":"杨","楓":"枫","楨":"桢","業":"业","極":"极","榘":"矩","榦":"干","榪":"杩","榮":"荣","榲":"榅","榿":"桤","構":"构","槍":"枪","槓":"杠","槤":"梿","槧":"椠","槨":"椁","槫":"𣏢","槮":"椮","槳":"桨","槶":"椢","槼":"椝","樁":"桩","樂":"乐","樅":"枞","樑":"梁","樓":"楼","標":"标","樞":"枢","樠":"𣗊","樢":"㭤","樣":"样","樤":"𣔌","樧":"榝","樫":"㭴","樳":"桪","樸":"朴","樹":"树","樺":"桦","樿":"椫","橈":"桡","橋":"桥","機":"机","橢":"椭","橫":"横","橯":"𣓿","檁":"檩","檉":"柽","檔":"档","檜":"桧","檟":"槚","檢":"检","檣":"樯","檭":"𣘴","檮":"梼","檯":"台","檳":"槟","檵":"𪲛","檸":"柠","檻":"槛","櫃":"柜","櫅":"𪲎","櫍":"𬃊","櫓":"橹","櫚":"榈","櫛":"栉","櫝":"椟","櫞":"橼","櫟":"栎","櫠":"𪲮","櫥":"橱","櫧":"槠","櫨":"栌","櫪":"枥","櫫":"橥","櫬":"榇","櫱":"蘖","櫳":"栊","櫸":"榉","櫻":"樱","欄":"栏","欅":"榉","欇":"𪳍","權":"权","欍":"𣐤","欏":"椤","欐":"𪲔","欑":"𪴙","欒":"栾","欓":"𣗋","欖":"榄","欘":"𣚚","欞":"棂","欽":"钦","歎":"叹","歐":"欧","歟":"欤","歡":"欢","歲":"岁","歷":"历","歸":"归","歿":"殁","殘":"残","殞":"殒","殢":"𣨼","殤":"殇","殨":"㱮","殫":"殚","殭":"僵","殮":"殓","殯":"殡","殰":"㱩","殲":"歼","殺":"杀","殻":"壳","殼":"壳","毀":"毁","毆":"殴","毊":"𪵑","毿":"毵","氂":"牦","氈":"毡","氌":"氇","氣":"气","氫":"氢","氬":"氩","氭":"𣱝","氳":"氲","氾":"泛","汎":"泛","汙":"污","決":"决","沒":"没","沖":"冲","況":"况","泝":"溯","洩":"泄","洶":"汹","浹":"浃","浿":"𬇙","涇":"泾","涗":"涚","涼":"凉","淒":"凄","淚":"泪","淥":"渌","淨":"净","淩":"凌","淪":"沦","淵":"渊","淶":"涞","淺":"浅","渙":"涣","減":"减","渢":"沨","渦":"涡","測":"测","渾":"浑","湊":"凑","湋":"𣲗","湞":"浈","湧":"涌","湯":"汤","溈":"沩","準":"准","溝":"沟","溡":"𪶄","溫":"温","溮":"浉","溳":"涢","溼":"湿","滄":"沧","滅":"灭","滌":"涤","滎":"荥","滙":"汇","滬":"沪","滯":"滞","滲":"渗","滷":"卤","滸":"浒","滻":"浐","滾":"滚","滿":"满","漁":"渔","漊":"溇","漍":"𬇹","漚":"沤","漢":"汉","漣":"涟","漬":"渍","漲":"涨","漵":"溆","漸":"渐","漿":"浆","潁":"颍","潑":"泼","潔":"洁","潕":"𣲘","潙":"沩","潚":"㴋","潛":"潜","潣":"𫞗","潤":"润","潯":"浔","潰":"溃","潷":"滗","潿":"涠","澀":"涩","澅":"𣶩","澆":"浇","澇":"涝","澐":"沄","澗":"涧","澠":"渑","澤":"泽","澦":"滪","澩":"泶","澫":"𬇕","澬":"𫞚","澮":"浍","澱":"淀","澾":"㳠","濁":"浊","濃":"浓","濄":"㳡","濆":"𣸣","濕":"湿","濘":"泞","濚":"溁","濛":"蒙","濜":"浕","濟":"济","濤":"涛","濧":"㳔","濫":"滥","濰":"潍","濱":"滨","濺":"溅","濼":"泺","濾":"滤","濿":"𪵱","瀂":"澛","瀃":"𣽷","瀅":"滢","瀆":"渎","瀇":"㲿","瀉":"泻","瀋":"沈","瀏":"浏","瀕":"濒","瀘":"泸","瀝":"沥","瀟":"潇","瀠":"潆","瀦":"潴","瀧":"泷","瀨":"濑","瀰":"弥","瀲":"潋","瀾":"澜","灃":"沣","灄":"滠","灍":"𫞝","灑":"洒","灒":"𪷽","灕":"漓","灘":"滩","灙":"𣺼","灝":"灏","灡":"㳕","灣":"湾","灤":"滦","灧":"滟","灩":"滟","災":"灾","為":"为","烏":"乌","烴":"烃","無":"无","煇":"𪸩","煉":"炼","煒":"炜","煙":"烟","煢":"茕","煥":"焕","煩":"烦","煬":"炀","煱":"㶽","熂":"𪸕","熅":"煴","熉":"𤈶","熌":"𤇄","熒":"荧","熓":"𤆡","熗":"炝","熚":"𤇹","熡":"𤋏","熰":"𬉼","熱":"热","熲":"颎","熾":"炽","燀":"𬊤","燁":"烨","燈":"灯","燉":"炖","燒":"烧","燖":"𬊈","燙":"烫","燜":"焖","營":"营","燦":"灿","燬":"毁","燭":"烛","燴":"烩","燶":"㶶","燻":"熏","燼":"烬","燾":"焘","爃":"𫞡","爄":"𤇃","爇":"𦶟","爍":"烁","爐":"炉","爖":"𤇭","爛":"烂","爥":"𪹳","爧":"𫞠","爭":"争","爲":"为","爺":"爷","爾":"尔","牀":"床","牆":"墙","牘":"牍","牴":"牴","牽":"牵","犖":"荦","犛":"牦","犞":"𪺭","犢":"犊","犧":"牺","狀":"状","狹":"狭","狽":"狈","猌":"𪺽","猙":"狰","猶":"犹","猻":"狲","獁":"犸","獃":"呆","獄":"狱","獅":"狮","獊":"𪺷","獎":"奖","獨":"独","獩":"𤞃","獪":"狯","獫":"猃","獮":"狝","獰":"狞","獱":"㺍","獲":"获","獵":"猎","獷":"犷","獸":"兽","獺":"獭","獻":"献","獼":"猕","玀":"猡","玁":"𤞤","珼":"𫞥","現":"现","琱":"雕","琺":"珐","琿":"珲","瑋":"玮","瑒":"玚","瑣":"琐","瑤":"瑶","瑩":"莹","瑪":"玛","瑲":"玱","瑻":"𪻲","瑽":"𪻐","璉":"琏","璊":"𫞩","璕":"𬍤","璗":"𬍡","璝":"𪻺","璡":"琎","璣":"玑","璦":"瑷","璫":"珰","璯":"㻅","環":"环","璵":"玙","璸":"瑸","璼":"𫞨","璽":"玺","璾":"𫞦","璿":"璇","瓄":"𪻨","瓅":"𬍛","瓊":"琼","瓏":"珑","瓔":"璎","瓕":"𤦀","瓚":"瓒","瓛":"𤩽","甌":"瓯","甕":"瓮","產":"产","産":"产","甦":"苏","甯":"宁","畝":"亩","畢":"毕","畫":"画","異":"异","畵":"画","當":"当","畼":"𪽈","疇":"畴","疊":"叠","痙":"痉","痠":"酸","痮":"𪽪","痾":"疴","瘂":"痖","瘋":"疯","瘍":"疡","瘓":"痪","瘞":"瘗","瘡":"疮","瘧":"疟","瘮":"瘆","瘱":"𪽷","瘲":"疭","瘺":"瘘","瘻":"瘘","療":"疗","癆":"痨","癇":"痫","癉":"瘅","癐":"𤶊","癒":"愈","癘":"疠","癟":"瘪","癡":"痴","癢":"痒","癤":"疖","癥":"症","癧":"疬","癩":"癞","癬":"癣","癭":"瘿","癮":"瘾","癰":"痈","癱":"瘫","癲":"癫","發":"发","皁":"皂","皚":"皑","皟":"𤾀","皰":"疱","皸":"皲","皺":"皱","盃":"杯","盜":"盗","盞":"盏","盡":"尽","監":"监","盤":"盘","盧":"卢","盨":"𪾔","盪":"荡","眝":"𪾣","眞":"真","眥":"眦","眾":"众","睍":"𪾢","睏":"困","睜":"睁","睞":"睐","瞘":"眍","瞜":"䁖","瞞":"瞒","瞤":"𥆧","瞭":"瞭","瞶":"瞆","瞼":"睑","矇":"蒙","矉":"𪾸","矑":"𪾦","矓":"眬","矚":"瞩","矯":"矫","硃":"朱","硜":"硁","硤":"硖","硨":"砗","硯":"砚","碕":"埼","碙":"𥐻","碩":"硕","碭":"砀","碸":"砜","確":"确","碼":"码","碽":"䂵","磑":"硙","磚":"砖","磠":"硵","磣":"碜","磧":"碛","磯":"矶","磽":"硗","磾":"䃅","礄":"硚","礆":"硷","礎":"础","礐":"𬒈","礒":"𥐟","礙":"碍","礦":"矿","礪":"砺","礫":"砾","礬":"矾","礮":"𪿫","礱":"砻","祇":"祇","祕":"秘","祿":"禄","禍":"祸","禎":"祯","禕":"祎","禡":"祃","禦":"御","禪":"禅","禮":"礼","禰":"祢","禱":"祷","禿":"秃","秈":"籼","稅":"税","稈":"秆","稏":"䅉","稜":"棱","稟":"禀","種":"种","稱":"称","穀":"谷","穇":"䅟","穌":"稣","積":"积","穎":"颖","穠":"秾","穡":"穑","穢":"秽","穩":"稳","穫":"获","穭":"穞","窩":"窝","窪":"洼","窮":"穷","窯":"窑","窵":"窎","窶":"窭","窺":"窥","竄":"窜","竅":"窍","竇":"窦","竈":"灶","竊":"窃","竚":"𥩟","竪":"竖","竱":"𫁟","競":"竞","筆":"笔","筍":"笋","筧":"笕","筴":"䇲","箇":"个","箋":"笺","箏":"筝","節":"节","範":"范","築":"筑","篋":"箧","篔":"筼","篘":"𥬠","篠":"筿","篢":"𬕂","篤":"笃","篩":"筛","篳":"筚","篸":"𥮾","簀":"箦","簂":"𫂆","簍":"篓","簑":"蓑","簞":"箪","簡":"简","簢":"𫂃","簣":"篑","簫":"箫","簹":"筜","簽":"签","簾":"帘","籃":"篮","籅":"𥫣","籋":"𥬞","籌":"筹","籔":"䉤","籙":"箓","籛":"篯","籜":"箨","籟":"籁","籠":"笼","籤":"签","籩":"笾","籪":"簖","籬":"篱","籮":"箩","籲":"吁","粵":"粤","糉":"粽","糝":"糁","糞":"粪","糧":"粮","糰":"团","糲":"粝","糴":"籴","糶":"粜","糹":"纟","糺":"𫄙","糾":"纠","紀":"纪","紂":"纣","紃":"𬘓","約":"约","紅":"红","紆":"纡","紇":"纥","紈":"纨","紉":"纫","紋":"纹","納":"纳","紐":"纽","紓":"纾","純":"纯","紕":"纰","紖":"纼","紗":"纱","紘":"纮","紙":"纸","級":"级","紛":"纷","紜":"纭","紝":"纴","紞":"𬘘","紟":"𫄛","紡":"纺","紬":"䌷","紮":"扎","細":"细","紱":"绂","紲":"绁","紳":"绅","紵":"纻","紹":"绍","紺":"绀","紼":"绋","紿":"绐","絀":"绌","絁":"𫄟","終":"终","絃":"弦","組":"组","絅":"䌹","絆":"绊","絍":"𫟃","絎":"绗","結":"结","絕":"绝","絙":"𫄠","絛":"绦","絝":"绔","絞":"绞","絡":"络","絢":"绚","絥":"𫄢","給":"给","絧":"𫄡","絨":"绒","絪":"𬘡","絰":"绖","統":"统","絲":"丝","絳":"绛","絶":"绝","絹":"绢","絺":"𫄨","綀":"𦈌","綁":"绑","綃":"绡","綄":"𬘫","綆":"绠","綇":"𦈋","綈":"绨","綉":"绣","綋":"𫟄","綌":"绤","綎":"𬘩","綏":"绥","綐":"䌼","綑":"捆","經":"经","綖":"𫄧","綜":"综","綝":"𬘭","綞":"缍","綟":"𫄫","綠":"绿","綡":"𫟅","綢":"绸","綣":"绻","綧":"𬘯","綪":"𬘬","綫":"线","綬":"绶","維":"维","綯":"绹","綰":"绾","綱":"纲","網":"网","綳":"绷","綴":"缀","綵":"彩","綸":"纶","綹":"绺","綺":"绮","綻":"绽","綽":"绰","綾":"绫","綿":"绵","緄":"绲","緇":"缁","緊":"紧","緋":"绯","緍":"𦈏","緑":"绿","緒":"绪","緓":"绬","緔":"绱","緗":"缃","緘":"缄","緙":"缂","線":"线","緝":"缉","緞":"缎","緟":"𫟆","締":"缔","緡":"缗","緣":"缘","緤":"𫄬","緦":"缌","編":"编","緩":"缓","緬":"缅","緮":"𫄭","緯":"纬","緰":"𦈕","緱":"缑","緲":"缈","練":"练","緶":"缏","緷":"𦈉","緸":"𦈑","緹":"缇","緻":"致","緼":"缊","縈":"萦","縉":"缙","縊":"缢","縋":"缒","縍":"𫄰","縎":"𦈔","縐":"绉","縑":"缣","縕":"缊","縗":"缞","縛":"缚","縝":"缜","縞":"缟","縟":"缛","縣":"县","縧":"绦","縫":"缝","縬":"𦈚","縭":"缡","縮":"缩","縯":"𬙂","縰":"𫄳","縱":"纵","縲":"缧","縳":"䌸","縴":"纤","縵":"缦","縶":"絷","縷":"缕","縸":"𫄲","縹":"缥","縺":"𦈐","總":"总","績":"绩","繂":"𫄴","繃":"绷","繅":"缫","繆":"缪","繈":"𫄶","繏":"𦈝","繐":"𰬸","繒":"缯","繓":"𦈛","織":"织","繕":"缮","繚":"缭","繞":"绕","繟":"𦈎","繡":"绣","繢":"缋","繨":"𫄤","繩":"绳","繪":"绘","繫":"系","繬":"𫄱","繭":"茧","繮":"缰","繯":"缳","繰":"缲","繳":"缴","繶":"𫄷","繷":"𫄣","繸":"䍁","繹":"绎","繻":"𦈡","繼":"继","繽":"缤","繾":"缱","繿":"䍀","纁":"𫄸","纆":"𬙊","纇":"颣","纈":"缬","纊":"纩","續":"续","纍":"累","纏":"缠","纓":"缨","纔":"才","纕":"𬙋","纖":"纤","纗":"𫄹","纘":"缵","纚":"𫄥","纜":"缆","缽":"钵","罃":"䓨","罈":"坛","罌":"罂","罎":"坛","罰":"罚","罵":"骂","罷":"罢","羅":"罗","羆":"罴","羈":"羁","羋":"芈","羣":"群","羥":"羟","羨":"羡","義":"义","羵":"𫅗","羶":"膻","習":"习","翫":"玩","翬":"翚","翹":"翘","翽":"翙","耬":"耧","耮":"耢","聖":"圣","聞":"闻","聯":"联","聰":"聪","聲":"声","聳":"耸","聵":"聩","聶":"聂","職":"职","聹":"聍","聻":"𫆏","聽":"听","聾":"聋","肅":"肃","脅":"胁","脈":"脉","脛":"胫","脣":"唇","脥":"𣍰","脩":"修","脫":"脱","脹":"胀","腎":"肾","腖":"胨","腡":"脶","腦":"脑","腪":"𣍯","腫":"肿","腳":"脚","腸":"肠","膃":"腽","膕":"腘","膚":"肤","膞":"䏝","膠":"胶","膢":"𦝼","膩":"腻","膹":"𪱥","膽":"胆","膾":"脍","膿":"脓","臉":"脸","臍":"脐","臏":"膑","臗":"𣎑","臘":"腊","臚":"胪","臟":"脏","臠":"脔","臢":"臜","臥":"卧","臨":"临","臺":"台","與":"与","興":"兴","舉":"举","舊":"旧","舘":"馆","艙":"舱","艣":"𫇛","艤":"舣","艦":"舰","艫":"舻","艱":"艰","艷":"艳","芻":"刍","苧":"苎","茲":"兹","荊":"荆","莊":"庄","莖":"茎","莢":"荚","莧":"苋","菕":"𰰨","華":"华","菴":"庵","菸":"烟","萇":"苌","萊":"莱","萬":"万","萴":"荝","萵":"莴","葉":"叶","葒":"荭","葝":"𫈎","葤":"荮","葦":"苇","葯":"药","葷":"荤","蒍":"𫇭","蒐":"搜","蒓":"莼","蒔":"莳","蒕":"蒀","蒞":"莅","蒭":"𫇴","蒼":"苍","蓀":"荪","蓆":"席","蓋":"盖","蓧":"𦰏","蓮":"莲","蓯":"苁","蓴":"莼","蓽":"荜","蔄":"𬜬","蔔":"卜","蔘":"参","蔞":"蒌","蔣":"蒋","蔥":"葱","蔦":"茑","蔭":"荫","蔯":"𫈟","蔿":"𫇭","蕁":"荨","蕆":"蒇","蕎":"荞","蕒":"荬","蕓":"芸","蕕":"莸","蕘":"荛","蕝":"𫈵","蕢":"蒉","蕩":"荡","蕪":"芜","蕭":"萧","蕳":"𫈉","蕷":"蓣","蕽":"𫇽","薀":"蕰","薆":"𫉁","薈":"荟","薊":"蓟","薌":"芗","薑":"姜","薔":"蔷","薘":"荙","薟":"莶","薦":"荐","薩":"萨","薳":"䓕","薴":"苧","薵":"䓓","薹":"苔","薺":"荠","藉":"藉","藍":"蓝","藎":"荩","藝":"艺","藥":"药","藪":"薮","藭":"䓖","藴":"蕴","藶":"苈","藷":"𫉄","藹":"蔼","藺":"蔺","蘀":"萚","蘄":"蕲","蘆":"芦","蘇":"苏","蘊":"蕴","蘋":"苹","蘚":"藓","蘞":"蔹","蘟":"𦻕","蘢":"茏","蘭":"兰","蘺":"蓠","蘿":"萝","虆":"蔂","虉":"𬟁","處":"处","虛":"虚","虜":"虏","號":"号","虧":"亏","虯":"虬","蛺":"蛱","蛻":"蜕","蜆":"蚬","蝀":"𬟽","蝕":"蚀","蝟":"猬","蝦":"虾","蝨":"虱","蝸":"蜗","螄":"蛳","螞":"蚂","螢":"萤","螮":"䗖","螻":"蝼","螿":"螀","蟂":"𫋇","蟄":"蛰","蟈":"蝈","蟎":"螨","蟘":"𫋌","蟜":"𫊸","蟣":"虮","蟬":"蝉","蟯":"蛲","蟲":"虫","蟳":"𫊻","蟶":"蛏","蟻":"蚁","蠀":"𧏗","蠁":"蚃","蠅":"蝇","蠆":"虿","蠍":"蝎","蠐":"蛴","蠑":"蝾","蠔":"蚝","蠙":"𧏖","蠟":"蜡","蠣":"蛎","蠦":"𫊮","蠨":"蟏","蠱":"蛊","蠶":"蚕","蠻":"蛮","蠾":"𧑏","衆":"众","衊":"蔑","術":"术","衕":"同","衚":"胡","衛":"卫","衝":"冲","衹":"衹","袞":"衮","裊":"袅","裏":"里","補":"补","裝":"装","裡":"里","製":"制","複":"复","褌":"裈","褘":"袆","褲":"裤","褳":"裢","褸":"褛","褻":"亵","襀":"𫌀","襇":"裥","襉":"裥","襏":"袯","襓":"𫋹","襖":"袄","襗":"𫋷","襘":"𫋻","襝":"裣","襠":"裆","襤":"褴","襪":"袜","襬":"摆","襯":"衬","襰":"𧝝","襲":"袭","襴":"襕","襵":"𫌇","覆":"覆","覈":"核","見":"见","覎":"觃","規":"规","覓":"觅","視":"视","覘":"觇","覛":"𫌪","覡":"觋","覥":"觍","覦":"觎","親":"亲","覬":"觊","覯":"觏","覲":"觐","覷":"觑","覹":"𫌭","覺":"觉","覼":"𫌨","覽":"览","覿":"觌","觀":"观","觴":"觞","觶":"觯","觸":"触","訁":"讠","訂":"订","訃":"讣","計":"计","訊":"讯","訌":"讧","討":"讨","訏":"𬣙","訐":"讦","訑":"𫍙","訒":"讱","訓":"训","訕":"讪","訖":"讫","託":"托","記":"记","訛":"讹","訜":"𫍛","訝":"讶","訞":"𫍚","訟":"讼","訢":"䜣","訣":"诀","訥":"讷","訨":"𫟞","訩":"讻","訪":"访","設":"设","許":"许","訴":"诉","訶":"诃","診":"诊","註":"注","証":"证","詀":"𧮪","詁":"诂","詆":"诋","詊":"𫟟","詎":"讵","詐":"诈","詑":"𫍡","詒":"诒","詓":"𫍜","詔":"诏","評":"评","詖":"诐","詗":"诇","詘":"诎","詛":"诅","詝":"𬣞","詞":"词","詠":"咏","詡":"诩","詢":"询","詣":"诣","試":"试","詩":"诗","詪":"𬣳","詫":"诧","詬":"诟","詭":"诡","詮":"诠","詰":"诘","話":"话","該":"该","詳":"详","詵":"诜","詷":"𫍣","詼":"诙","詿":"诖","誂":"𫍥","誄":"诔","誅":"诛","誆":"诓","誇":"夸","誋":"𫍪","誌":"志","認":"认","誑":"诳","誒":"诶","誕":"诞","誘":"诱","誚":"诮","語":"语","誠":"诚","誡":"诫","誣":"诬","誤":"误","誥":"诰","誦":"诵","誨":"诲","說":"说","誫":"𫍨","説":"说","誰":"谁","課":"课","誳":"𫍮","誴":"𫟡","誶":"谇","誷":"𫍬","誹":"诽","誺":"𫍧","誼":"谊","誾":"訚","調":"调","諂":"谄","諄":"谆","談":"谈","諉":"诿","請":"请","諍":"诤","諏":"诹","諑":"诼","諒":"谅","諓":"𬣡","論":"论","諗":"谂","諛":"谀","諜":"谍","諝":"谞","諞":"谝","諟":"𬤊","諡":"谥","諢":"诨","諣":"𫍩","諤":"谔","諥":"𫍳","諦":"谛","諧":"谐","諫":"谏","諭":"谕","諮":"咨","諯":"𫍱","諰":"𫍰","諱":"讳","諲":"𬤇","諳":"谙","諴":"𫍯","諶":"谌","諷":"讽","諸":"诸","諺":"谚","諼":"谖","諾":"诺","謀":"谋","謁":"谒","謂":"谓","謄":"誊","謅":"诌","謆":"𫍸","謉":"𫍷","謊":"谎","謎":"谜","謏":"𫍲","謐":"谧","謔":"谑","謖":"谡","謗":"谤","謙":"谦","謚":"谥","講":"讲","謝":"谢","謠":"谣","謡":"谣","謨":"谟","謫":"谪","謬":"谬","謭":"谫","謯":"𫍹","謱":"𫍴","謳":"讴","謸":"𫍵","謹":"谨","謾":"谩","譁":"哗","譂":"𫟠","譅":"𰶎","譆":"𫍻","證":"证","譊":"𫍢","譎":"谲","譏":"讥","譑":"𫍤","譓":"𬤝","譖":"谮","識":"识","譙":"谯","譚":"谭","譜":"谱","譞":"𫍽","譟":"噪","譨":"𫍦","譫":"谵","譭":"毁","譯":"译","議":"议","譴":"谴","護":"护","譸":"诪","譽":"誉","譾":"谫","讀":"读","讅":"谉","變":"变","讋":"詟","讌":"䜩","讎":"雠","讒":"谗","讓":"让","讕":"谰","讖":"谶","讚":"赞","讜":"谠","讞":"谳","豈":"岂","豎":"竖","豐":"丰","豔":"艳","豬":"猪","豵":"𫎆","豶":"豮","貓":"猫","貗":"𫎌","貙":"䝙","貝":"贝","貞":"贞","貟":"贠","負":"负","財":"财","貢":"贡","貧":"贫","貨":"货","販":"贩","貪":"贪","貫":"贯","責":"责","貯":"贮","貰":"贳","貲":"赀","貳":"贰","貴":"贵","貶":"贬","買":"买","貸":"贷","貺":"贶","費":"费","貼":"贴","貽":"贻","貿":"贸","賀":"贺","賁":"贲","賂":"赂","賃":"赁","賄":"贿","賅":"赅","資":"资","賈":"贾","賊":"贼","賑":"赈","賒":"赊","賓":"宾","賕":"赇","賙":"赒","賚":"赉","賜":"赐","賝":"𫎩","賞":"赏","賟":"𧹖","賠":"赔","賡":"赓","賢":"贤","賣":"卖","賤":"贱","賦":"赋","賧":"赕","質":"质","賫":"赍","賬":"账","賭":"赌","賰":"䞐","賴":"赖","賵":"赗","賺":"赚","賻":"赙","購":"购","賽":"赛","賾":"赜","贃":"𧹗","贄":"贽","贅":"赘","贇":"赟","贈":"赠","贉":"𫎫","贊":"赞","贋":"赝","贍":"赡","贏":"赢","贐":"赆","贑":"𫎬","贓":"赃","贔":"赑","贖":"赎","贗":"赝","贚":"𫎦","贛":"赣","贜":"赃","赬":"赪","趕":"赶","趙":"赵","趨":"趋","趲":"趱","跡":"迹","踐":"践","踰":"逾","踴":"踊","蹌":"跄","蹔":"𫏐","蹕":"跸","蹟":"迹","蹠":"跖","蹣":"蹒","蹤":"踪","蹳":"𫏆","蹺":"跷","蹻":"𫏋","躂":"跶","躉":"趸","躊":"踌","躋":"跻","躍":"跃","躎":"䟢","躑":"踯","躒":"跞","躓":"踬","躕":"蹰","躘":"𨀁","躚":"跹","躝":"𨅬","躡":"蹑","躥":"蹿","躦":"躜","躪":"躏","軀":"躯","軉":"𨉗","車":"车","軋":"轧","軌":"轨","軍":"军","軏":"𫐄","軑":"轪","軒":"轩","軔":"轫","軕":"𫐅","軗":"𨐅","軛":"轭","軜":"𫐇","軝":"𬨂","軟":"软","軤":"轷","軨":"𫐉","軫":"轸","軬":"𫐊","軲":"轱","軷":"𫐈","軸":"轴","軹":"轵","軺":"轺","軻":"轲","軼":"轶","軾":"轼","軿":"𫐌","較":"较","輄":"𨐈","輅":"辂","輇":"辁","輈":"辀","載":"载","輊":"轾","輋":"𪨶","輒":"辄","輓":"挽","輔":"辅","輕":"轻","輖":"𫐏","輗":"𫐐","輛":"辆","輜":"辎","輝":"辉","輞":"辋","輟":"辍","輢":"𫐎","輥":"辊","輦":"辇","輨":"𫐑","輩":"辈","輪":"轮","輬":"辌","輮":"𫐓","輯":"辑","輳":"辏","輶":"𬨎","輷":"𫐒","輸":"输","輻":"辐","輼":"辒","輾":"辗","輿":"舆","轀":"辒","轂":"毂","轄":"辖","轅":"辕","轆":"辘","轇":"𫐖","轉":"转","轊":"𫐕","轍":"辙","轎":"轿","轐":"𫐗","轔":"辚","轗":"𫐘","轟":"轰","轠":"𫐙","轡":"辔","轢":"轹","轣":"𫐆","轤":"轳","辦":"办","辭":"辞","辮":"辫","辯":"辩","農":"农","迴":"回","逕":"迳","這":"这","連":"连","週":"周","進":"进","遊":"游","運":"运","過":"过","達":"达","違":"违","遙":"遥","遜":"逊","遞":"递","遠":"远","遡":"溯","適":"适","遱":"𫐷","遲":"迟","遷":"迁","選":"选","遺":"遗","遼":"辽","邁":"迈","還":"还","邇":"迩","邊":"边","邏":"逻","邐":"逦","郟":"郏","郵":"邮","鄆":"郓","鄉":"乡","鄒":"邹","鄔":"邬","鄖":"郧","鄟":"𫑘","鄧":"邓","鄩":"𬩽","鄭":"郑","鄰":"邻","鄲":"郸","鄳":"𫑡","鄴":"邺","鄶":"郐","鄺":"邝","酇":"酂","酈":"郦","醃":"腌","醖":"酝","醜":"丑","醞":"酝","醟":"蒏","醣":"糖","醫":"医","醬":"酱","醱":"酦","醲":"𬪩","醶":"𫑷","釀":"酿","釁":"衅","釃":"酾","釅":"酽","釋":"释","釐":"厘","釒":"钅","釓":"钆","釔":"钇","釕":"钌","釗":"钊","釘":"钉","釙":"钋","釚":"𫟲","針":"针","釟":"𫓥","釣":"钓","釤":"钐","釦":"扣","釧":"钏","釨":"𫓦","釩":"钒","釲":"𫟳","釳":"𨰿","釴":"𬬩","釵":"钗","釷":"钍","釹":"钕","釺":"钎","釾":"䥺","釿":"𬬱","鈀":"钯","鈁":"钫","鈃":"钘","鈄":"钭","鈅":"钥","鈆":"𫓪","鈇":"𫓧","鈈":"钚","鈉":"钠","鈋":"𨱂","鈍":"钝","鈎":"钩","鈐":"钤","鈑":"钣","鈒":"钑","鈔":"钞","鈕":"钮","鈖":"𫟴","鈗":"𫟵","鈛":"𫓨","鈞":"钧","鈠":"𨱁","鈡":"钟","鈣":"钙","鈥":"钬","鈦":"钛","鈧":"钪","鈮":"铌","鈯":"𨱄","鈰":"铈","鈲":"𨱃","鈳":"钶","鈴":"铃","鈷":"钴","鈸":"钹","鈹":"铍","鈺":"钰","鈽":"钸","鈾":"铀","鈿":"钿","鉀":"钾","鉁":"𨱅","鉅":"巨","鉆":"钻","鉈":"铊","鉉":"铉","鉊":"𬬿","鉋":"铇","鉍":"铋","鉑":"铂","鉔":"𫓬","鉕":"钷","鉗":"钳","鉚":"铆","鉛":"铅","鉝":"𫟷","鉞":"钺","鉠":"𫓭","鉢":"钵","鉤":"钩","鉥":"𬬸","鉦":"钲","鉧":"𬭁","鉬":"钼","鉭":"钽","鉮":"𬬹","鉳":"锫","鉶":"铏","鉷":"𫟹","鉸":"铰","鉺":"铒","鉻":"铬","鉽":"𫟸","鉾":"𫓴","鉿":"铪","銀":"银","銁":"𫓲","銂":"𫟻","銃":"铳","銅":"铜","銈":"𫓯","銊":"𫓰","銍":"铚","銏":"𫟶","銑":"铣","銓":"铨","銖":"铢","銘":"铭","銚":"铫","銛":"铦","銜":"衔","銠":"铑","銣":"铷","銥":"铱","銦":"铟","銨":"铵","銩":"铥","銪":"铕","銫":"铯","銬":"铐","銱":"铞","銳":"锐","銶":"𨱇","銷":"销","銹":"锈","銻":"锑","銼":"锉","鋁":"铝","鋂":"𰾄","鋃":"锒","鋅":"锌","鋇":"钡","鋉":"𨱈","鋌":"铤","鋏":"铗","鋐":"𬭎","鋒":"锋","鋗":"𫓶","鋙":"铻","鋝":"锊","鋟":"锓","鋠":"𫓵","鋣":"铘","鋤":"锄","鋥":"锃","鋦":"锔","鋨":"锇","鋩":"铓","鋪":"铺","鋭":"锐","鋮":"铖","鋯":"锆","鋰":"锂","鋱":"铽","鋶":"锍","鋸":"锯","鋹":"𬬮","鋼":"钢","錀":"𬬭","錁":"锞","錂":"𨱋","錄":"录","錆":"锖","錇":"锫","錈":"锩","錏":"铔","錐":"锥","錒":"锕","錕":"锟","錘":"锤","錙":"锱","錚":"铮","錛":"锛","錜":"𫓻","錝":"𫓽","錞":"𬭚","錟":"锬","錠":"锭","錡":"锜","錢":"钱","錤":"𫓹","錥":"𫓾","錦":"锦","錨":"锚","錩":"锠","錫":"锡","錮":"锢","錯":"错","録":"录","錳":"锰","錶":"表","錸":"铼","錼":"镎","錽":"𫓸","鍀":"锝","鍁":"锨","鍃":"锪","鍄":"𨱉","鍅":"钫","鍆":"钔","鍇":"锴","鍈":"锳","鍉":"𫔂","鍊":"炼","鍋":"锅","鍍":"镀","鍒":"𫔄","鍔":"锷","鍘":"铡","鍚":"钖","鍛":"锻","鍠":"锽","鍤":"锸","鍥":"锲","鍩":"锘","鍬":"锹","鍭":"𬭤","鍮":"𨱎","鍰":"锾","鍵":"键","鍶":"锶","鍺":"锗","鍼":"针","鍾":"钟","鎂":"镁","鎄":"锿","鎇":"镅","鎈":"𫟿","鎊":"镑","鎌":"镰","鎍":"𫔅","鎓":"𬭩","鎔":"镕","鎖":"锁","鎘":"镉","鎙":"𫔈","鎚":"锤","鎛":"镈","鎝":"𨱏","鎞":"𫔇","鎡":"镃","鎢":"钨","鎣":"蓥","鎦":"镏","鎧":"铠","鎩":"铩","鎪":"锼","鎬":"镐","鎭":"镇","鎮":"镇","鎯":"𨱍","鎰":"镒","鎲":"镋","鎳":"镍","鎵":"镓","鎶":"鿔","鎷":"𨰾","鎸":"镌","鎿":"镎","鏃":"镞","鏆":"𨱌","鏇":"旋","鏈":"链","鏉":"𨱒","鏌":"镆","鏍":"镙","鏏":"𬭬","鏐":"镠","鏑":"镝","鏗":"铿","鏘":"锵","鏚":"𬭭","鏜":"镗","鏝":"镘","鏞":"镛","鏟":"铲","鏡":"镜","鏢":"镖","鏤":"镂","鏥":"𫔊","鏦":"𫓩","鏨":"錾","鏰":"镚","鏵":"铧","鏷":"镤","鏹":"镪","鏺":"䥽","鏻":"𬭸","鏽":"锈","鏾":"𫔌","鐃":"铙","鐄":"𨱑","鐇":"𫔍","鐈":"𫓱","鐋":"铴","鐍":"𫔎","鐎":"𨱓","鐏":"𨱔","鐐":"镣","鐒":"铹","鐓":"镦","鐔":"镡","鐘":"钟","鐙":"镫","鐝":"镢","鐠":"镨","鐥":"䦅","鐦":"锎","鐧":"锏","鐨":"镄","鐩":"𬭼","鐪":"𫓺","鐫":"镌","鐮":"镰","鐯":"䦃","鐲":"镯","鐳":"镭","鐵":"铁","鐶":"镮","鐸":"铎","鐺":"铛","鐼":"𫔁","鐽":"𫟼","鐿":"镱","鑀":"𰾭","鑄":"铸","鑉":"𫠁","鑊":"镬","鑌":"镔","鑑":"鉴","鑒":"鉴","鑔":"镲","鑕":"锧","鑞":"镴","鑠":"铄","鑣":"镳","鑥":"镥","鑪":"𬬻","鑭":"镧","鑰":"钥","鑱":"镵","鑲":"镶","鑴":"𫔔","鑷":"镊","鑹":"镩","鑼":"锣","鑽":"钻","鑾":"銮","鑿":"凿","钁":"镢","钂":"镋","長":"长","門":"门","閂":"闩","閃":"闪","閆":"闫","閈":"闬","閉":"闭","開":"开","閌":"闶","閍":"𨸂","閎":"闳","閏":"闰","閐":"𨸃","閑":"闲","閒":"闲","間":"间","閔":"闵","閗":"𫔯","閘":"闸","閝":"𫠂","閞":"𫔰","閡":"阂","閣":"阁","閤":"合","閥":"阀","閨":"闺","閩":"闽","閫":"阃","閬":"阆","閭":"闾","閱":"阅","閲":"阅","閵":"𫔴","閶":"阊","閹":"阉","閻":"阎","閼":"阏","閽":"阍","閾":"阈","閿":"阌","闃":"阒","闆":"板","闇":"暗","闈":"闱","闉":"𬮱","闊":"阔","闋":"阕","闌":"阑","闍":"阇","闐":"阗","闑":"𫔶","闒":"阘","闓":"闿","闔":"阖","闕":"阙","闖":"闯","關":"关","闞":"阚","闠":"阓","闡":"阐","闢":"辟","闤":"阛","闥":"闼","阪":"阪","陘":"陉","陝":"陕","陞":"升","陣":"阵","陰":"阴","陳":"陈","陸":"陆","陽":"阳","隉":"陧","隊":"队","階":"阶","隑":"𬮿","隕":"陨","際":"际","隤":"𬯎","隨":"随","險":"险","隮":"𬯀","隯":"陦","隱":"隐","隴":"陇","隸":"隶","隻":"只","雋":"隽","雖":"虽","雙":"双","雛":"雏","雜":"杂","雞":"鸡","離":"离","難":"难","雲":"云","電":"电","霑":"沾","霢":"霡","霣":"𫕥","霧":"雾","霼":"𪵣","霽":"霁","靂":"雳","靄":"霭","靆":"叇","靈":"灵","靉":"叆","靚":"靓","靜":"静","靝":"靔","靦":"腼","靧":"𫖃","靨":"靥","鞏":"巩","鞝":"绱","鞦":"秋","鞽":"鞒","鞾":"𫖇","韁":"缰","韃":"鞑","韆":"千","韉":"鞯","韋":"韦","韌":"韧","韍":"韨","韓":"韩","韙":"韪","韚":"𫠅","韛":"𫖔","韜":"韬","韝":"鞲","韞":"韫","韠":"𫖒","韻":"韵","響":"响","頁":"页","頂":"顶","頃":"顷","項":"项","順":"顺","頇":"顸","須":"须","頊":"顼","頌":"颂","頍":"𫠆","頎":"颀","頏":"颃","預":"预","頑":"顽","頒":"颁","頓":"顿","頔":"𬱖","頗":"颇","領":"领","頜":"颌","頠":"𬱟","頡":"颉","頤":"颐","頦":"颏","頫":"𫖯","頭":"头","頮":"颒","頰":"颊","頲":"颋","頴":"颕","頵":"𫖳","頷":"颔","頸":"颈","頹":"颓","頻":"频","頽":"颓","顂":"𩓋","顃":"𩖖","顅":"𫖶","顆":"颗","題":"题","額":"额","顎":"颚","顏":"颜","顒":"颙","顓":"颛","顔":"颜","顗":"𫖮","願":"愿","顙":"颡","顛":"颠","類":"类","顢":"颟","顣":"𫖹","顥":"颢","顧":"顾","顫":"颤","顬":"颥","顯":"显","顰":"颦","顱":"颅","顳":"颞","顴":"颧","風":"风","颭":"飐","颮":"飑","颯":"飒","颰":"𩙥","颱":"台","颳":"刮","颶":"飓","颷":"𩙪","颸":"飔","颺":"飏","颻":"飖","颼":"飕","颾":"𩙫","飀":"飗","飄":"飘","飆":"飙","飈":"飚","飋":"𫗋","飛":"飞","飠":"饣","飢":"饥","飣":"饤","飥":"饦","飦":"𫗞","飩":"饨","飪":"饪","飫":"饫","飭":"饬","飯":"饭","飱":"飧","飲":"饮","飴":"饴","飵":"𫗢","飶":"𫗣","飼":"饲","飽":"饱","飾":"饰","飿":"饳","餃":"饺","餄":"饸","餅":"饼","餈":"糍","餉":"饷","養":"养","餌":"饵","餎":"饹","餏":"饻","餑":"饽","餒":"馁","餓":"饿","餔":"𫗦","餕":"馂","餖":"饾","餗":"𫗧","餘":"余","餚":"肴","餛":"馄","餜":"馃","餞":"饯","餡":"馅","餦":"𫗠","餧":"𫗪","館":"馆","餪":"𫗬","餫":"𫗥","餬":"糊","餭":"𫗮","餱":"糇","餳":"饧","餵":"喂","餶":"馉","餷":"馇","餸":"𩠌","餺":"馎","餼":"饩","餾":"馏","餿":"馊","饁":"馌","饃":"馍","饅":"馒","饈":"馐","饉":"馑","饊":"馓","饋":"馈","饌":"馔","饑":"饥","饒":"饶","饗":"飨","饘":"𫗴","饜":"餍","饞":"馋","饟":"𫗵","饠":"𫗩","饢":"馕","馬":"马","馭":"驭","馮":"冯","馯":"𫘛","馱":"驮","馳":"驰","馴":"驯","馹":"驲","馼":"𫘜","駁":"驳","駃":"𫘝","駉":"𬳶","駊":"𫘟","駎":"𩧨","駐":"驻","駑":"驽","駒":"驹","駓":"𬳵","駔":"驵","駕":"驾","駘":"骀","駙":"驸","駚":"𩧫","駛":"驶","駝":"驼","駞":"𫘞","駟":"驷","駡":"骂","駢":"骈","駤":"𫘠","駧":"𩧲","駩":"𩧴","駪":"𬳽","駫":"𫘡","駭":"骇","駰":"骃","駱":"骆","駶":"𩧺","駸":"骎","駻":"𫘣","駼":"𬳿","駿":"骏","騁":"骋","騂":"骍","騃":"𫘤","騄":"𫘧","騅":"骓","騉":"𫘥","騊":"𫘦","騌":"骔","騍":"骒","騎":"骑","騏":"骐","騑":"𬴂","騔":"𩨀","騖":"骛","騙":"骗","騚":"𩨊","騜":"𫘩","騝":"𩨃","騞":"𬴃","騟":"𩨈","騠":"𫘨","騤":"骙","騧":"䯄","騪":"𩨄","騫":"骞","騭":"骘","騮":"骝","騰":"腾","騱":"𫘬","騴":"𫘫","騵":"𫘪","騶":"驺","騷":"骚","騸":"骟","騻":"𫘭","騼":"𫠋","騾":"骡","驀":"蓦","驁":"骜","驂":"骖","驃":"骠","驄":"骢","驅":"驱","驊":"骅","驋":"𩧯","驌":"骕","驍":"骁","驎":"𬴊","驏":"骣","驓":"𫘯","驕":"骄","驗":"验","驙":"𫘰","驚":"惊","驛":"驿","驟":"骤","驢":"驴","驤":"骧","驥":"骥","驦":"骦","驨":"𫘱","驪":"骊","驫":"骉","骯":"肮","髏":"髅","髒":"脏","體":"体","髕":"髌","髖":"髋","髮":"发","鬆":"松","鬍":"胡","鬖":"𩭹","鬚":"须","鬠":"𫘽","鬢":"鬓","鬥":"斗","鬧":"闹","鬨":"哄","鬩":"阋","鬮":"阄","鬱":"郁","鬹":"鬶","魎":"魉","魘":"魇","魚":"鱼","魛":"鱽","魟":"𫚉","魢":"鱾","魥":"𩽹","魦":"𫚌","魨":"鲀","魯":"鲁","魴":"鲂","魵":"𫚍","魷":"鱿","魺":"鲄","魽":"𫠐","鮀":"𬶍","鮁":"鲅","鮃":"鲆","鮄":"𫚒","鮅":"𫚑","鮆":"𫚖","鮈":"𬶋","鮊":"鲌","鮋":"鲉","鮍":"鲏","鮎":"鲇","鮐":"鲐","鮑":"鲍","鮒":"鲋","鮓":"鲊","鮚":"鲒","鮜":"鲘","鮝":"鲞","鮞":"鲕","鮟":"𩽾","鮠":"𬶏","鮡":"𬶐","鮣":"䲟","鮤":"𫚓","鮦":"鲖","鮪":"鲔","鮫":"鲛","鮭":"鲑","鮮":"鲜","鮯":"𫚗","鮰":"𫚔","鮳":"鲓","鮵":"𫚛","鮶":"鲪","鮸":"3","鮺":"鲝","鮿":"𫚚","鯀":"鲧","鯁":"鲠","鯄":"𩾁","鯆":"𫚙","鯇":"鲩","鯉":"鲤","鯊":"鲨","鯒":"鲬","鯔":"鲻","鯕":"鲯","鯖":"鲭","鯗":"鲞","鯛":"鲷","鯝":"鲴","鯞":"𫚡","鯡":"鲱","鯢":"鲵","鯤":"鲲","鯧":"鲳","鯨":"鲸","鯪":"鲮","鯫":"鲰","鯬":"𫚞","鯰":"鲶","鯱":"𩾇","鯴":"鲺","鯶":"𩽼","鯷":"鳀","鯻":"𬶟","鯽":"鲫","鯾":"𫚣","鯿":"鳊","鰁":"鳈","鰂":"鲗","鰃":"鳂","鰆":"䲠","鰈":"鲽","鰉":"鳇","鰊":"𬶠","鰋":"𫚢","鰌":"䲡","鰍":"鳅","鰏":"鲾","鰐":"鳄","鰑":"𫚊","鰒":"鳆","鰓":"鳃","鰕":"𫚥","鰛":"鳁","鰜":"鳒","鰟":"鳑","鰠":"鳋","鰣":"鲥","鰤":"𫚕","鰥":"鳏","鰦":"𫚤","鰧":"䲢","鰨":"鳎","鰩":"鳐","鰫":"𫚦","鰭":"鳍","鰮":"鳁","鰱":"鲢","鰲":"鳌","鰳":"鳓","鰵":"鳘","鰶":"𬶭","鰷":"鲦","鰹":"鲣","鰺":"鲹","鰻":"鳗","鰼":"鳛","鰽":"𫚧","鰾":"鳔","鱀":"𬶨","鱂":"鳉","鱄":"𫚋","鱅":"鳙","鱆":"𫠒","鱇":"𩾌","鱈":"鳕","鱉":"鳖","鱊":"𫚪","鱒":"鳟","鱔":"鳝","鱖":"鳜","鱗":"鳞","鱘":"鲟","鱚":"𬶮","鱝":"鲼","鱟":"鲎","鱠":"鲙","鱢":"𫚫","鱣":"鳣","鱤":"鳡","鱧":"鳢","鱨":"鲿","鱭":"鲚","鱮":"𫚈","鱯":"鳠","鱲":"𫚭","鱷":"鳄","鱸":"鲈","鱺":"鲡","鳥":"鸟","鳧":"凫","鳩":"鸠","鳬":"凫","鳲":"鸤","鳳":"凤","鳴":"鸣","鳶":"鸢","鳷":"𫛛","鳼":"𪉃","鳽":"𫛚","鳾":"䴓","鴀":"𫛜","鴃":"𫛞","鴅":"𫛝","鴆":"鸩","鴇":"鸨","鴉":"鸦","鴐":"𫛤","鴒":"鸰","鴔":"𫛡","鴕":"鸵","鴗":"𫁡","鴛":"鸳","鴜":"𪉈","鴝":"鸲","鴞":"鸮","鴟":"鸱","鴣":"鸪","鴥":"𫛣","鴦":"鸯","鴨":"鸭","鴮":"𫛦","鴯":"鸸","鴰":"鸹","鴲":"𪉆","鴳":"𫛩","鴴":"鸻","鴷":"䴕","鴻":"鸿","鴽":"𫛪","鴿":"鸽","鵁":"䴔","鵂":"鸺","鵃":"鸼","鵊":"𫛥","鵏":"𬷕","鵐":"鹀","鵑":"鹃","鵒":"鹆","鵓":"鹁","鵚":"𪉍","鵜":"鹈","鵝":"鹅","鵟":"𫛭","鵠":"鹄","鵡":"鹉","鵧":"𫛨","鵩":"𫛳","鵪":"鹌","鵫":"𫛱","鵬":"鹏","鵮":"鹐","鵯":"鹎","鵰":"雕","鵲":"鹊","鵷":"鹓","鵾":"鹍","鶄":"䴖","鶇":"鸫","鶉":"鹑","鶊":"鹒","鶌":"𫛵","鶒":"𫛶","鶓":"鹋","鶖":"鹙","鶗":"𫛸","鶘":"鹕","鶚":"鹗","鶠":"𬸘","鶡":"鹖","鶥":"鹛","鶦":"𫛷","鶩":"鹜","鶪":"䴗","鶬":"鸧","鶭":"𫛯","鶯":"莺","鶰":"𫛫","鶱":"𬸣","鶲":"鹟","鶴":"鹤","鶹":"鹠","鶺":"鹡","鶻":"鹘","鶼":"鹣","鶿":"鹚","鷀":"鹚","鷁":"鹢","鷂":"鹞","鷄":"鸡","鷅":"𫛽","鷉":"䴘","鷊":"鹝","鷐":"𫜀","鷓":"鹧","鷔":"𪉑","鷖":"鹥","鷗":"鸥","鷙":"鸷","鷚":"鹨","鷟":"𬸦","鷣":"𫜃","鷤":"𫛴","鷥":"鸶","鷦":"鹪","鷨":"𪉊","鷩":"𫜁","鷫":"鹔","鷭":"𬸪","鷯":"鹩","鷲":"鹫","鷳":"鹇","鷴":"鹇","鷷":"𫜄","鷸":"鹬","鷹":"鹰","鷺":"鹭","鷽":"鸴","鷿":"𬸯","鸂":"㶉","鸇":"鹯","鸊":"䴙","鸋":"𫛢","鸌":"鹱","鸏":"鹲","鸑":"𬸚","鸕":"鸬","鸗":"𫛟","鸘":"鹴","鸚":"鹦","鸛":"鹳","鸝":"鹂","鸞":"鸾","鹵":"卤","鹹":"咸","鹺":"鹾","鹼":"碱","鹽":"盐","麗":"丽","麥":"麦","麨":"𪎊","麩":"麸","麪":"面","麫":"面","麬":"𤿲","麯":"曲","麲":"𪎉","麳":"𪎌","麴":"曲","麵":"面","麷":"𫜑","麼":"么","麽":"么","黃":"黄","黌":"黉","點":"点","黨":"党","黲":"黪","黴":"霉","黶":"黡","黷":"黩","黽":"黾","黿":"鼋","鼂":"鼌","鼉":"鼍","鼕":"冬","鼴":"鼹","齊":"齐","齋":"斋","齎":"赍","齏":"齑","齒":"齿","齔":"龀","齕":"龁","齗":"龂","齘":"𬹼","齙":"龅","齜":"龇","齟":"龃","齠":"龆","齡":"龄","齣":"出","齦":"龈","齧":"啮","齩":"𫜪","齪":"龊","齬":"龉","齭":"𫜭","齮":"𬺈","齯":"𫠜","齰":"𫜬","齲":"龋","齴":"𫜮","齶":"腭","齷":"龌","齼":"𬺓","齾":"𫜰","龍":"龙","龎":"厐","龐":"庞","龑":"䶮","龓":"𫜲","龔":"龚","龕":"龛","龜":"龟","龭":"𩨎","龯":"𨱆","鿁":"䜤","鿓":"鿒","𠁞":"𠀾","𠌥":"𠆿","𠏢":"𠉗","𠐊":"𫝋","𠗣":"㓆","𠞆":"𠛆","𠠎":"𠚳","𠬙":"𪠡","𠽃":"𪠺","𠿕":"𪜎","𡂡":"𪢒","𡃄":"𪡺","𡃕":"𠴛","𡃤":"𪢐","𡄔":"𠴢","𡄣":"𠵸","𡅏":"𠲥","𡅯":"𪢖","𡑍":"𫭼","𡑭":"𡋗","𡓁":"𪤄","𡓾":"𡋀","𡔖":"𡍣","𡞵":"㛟","𡟫":"𫝪","𡠹":"㛿","𡢃":"㛠","𡮉":"𡭜","𡮣":"𡭬","𡳳":"𡳃","𡸗":"𪨩","𡹬":"𪨹","𡻕":"岁","𡽗":"𡸃","𡾱":"㟜","𡿖":"𪩛","𢍰":"𪪴","𢠼":"𢙑","𢣐":"𪬚","𢣚":"𢘝","𢣭":"𢘞","𢤩":"𪫡","𢤱":"𢘙","𢤿":"𪬯","𢯷":"𪭝","𢶒":"𪭯","𢶫":"𢫞","𢷮":"𢫊","𢹿":"𢬦","𢺳":"𪮳","𣈶":"暅","𣋋":"𣈣","𣍐":"𫧃","𣙎":"㭣","𣜬":"𪳗","𣝕":"𣘷","𣞻":"𣘓","𣠩":"𣞎","𣠲":"𣑶","𣯩":"𣯣","𣯴":"𣭤","𣯶":"毶","𣽏":"𪶮","𣾷":"㳢","𣿉":"𣶫","𤁣":"𣺽","𤄷":"𪶒","𤅶":"𣷷","𤑳":"𤎻","𤑹":"𪹀","𤒎":"𤊀","𤒻":"𪹹","𤓌":"𪹠","𤓎":"𤎺","𤓩":"𤊰","𤘀":"𪺣","𤛮":"𤙯","𤛱":"𫞢","𤜆":"𪺪","𤠮":"𪺸","𤢟":"𤝢","𤢻":"𢢐","𤩂":"𫞧","𤪺":"㻘","𤫩":"㻏","𤬅":"𪼴","𤳷":"𪽝","𤳸":"𤳄","𤷃":"𪽭","𤸫":"𤶧","𤺔":"𪽴","𥊝":"𥅿","𥌃":"𥅘","𥏝":"𪿊","𥕥":"𥐰","𥖅":"𥐯","𥖲":"𪿞","𥗇":"𪿵","𥗽":"𬒗","𥜐":"𫀓","𥜰":"𫀌","𥞵":"𥞦","𥢢":"䅪","𥢶":"𫞷","𥢷":"𫀮","𥨐":"𥧂","𥪂":"𥩺","𥯤":"𫁳","𥴨":"𫂖","𥴼":"𫁺","𥵃":"𥱔","𥵊":"𥭉","𥶽":"𫁱","𥸠":"𥮋","𥻦":"𫂿","𥼽":"𥹥","𥽖":"𥺇","𥾯":"𫄝","𥿊":"𦈈","𦀖":"𫄦","𦂅":"𦈒","𦃄":"𦈗","𦃩":"𫄯","𦅇":"𫄪","𦅈":"𫄵","𦆲":"𫟇","𦒀":"𫅥","𦔖":"𫅼","𦘧":"𡳒","𦟼":"𫆝","𦠅":"𫞅","𦡝":"𫆫","𦢈":"𣍨","𦣎":"𦟗","𦧺":"𫇘","𦪙":"䑽","𦪽":"𦨩","𦱌":"𫇪","𦾟":"𦶻","𧎈":"𧌥","𧒯":"𫊹","𧔥":"𧒭","𧕟":"𧉐","𧜗":"䘞","𧜵":"䙊","𧝞":"䘛","𧞫":"𫌋","𧟀":"𧝧","𧡴":"𫌫","𧢄":"𫌬","𧦝":"𫍞","𧦧":"𫍟","𧩕":"𫍭","𧩙":"𬣥","𧩼":"𫍶","𧫝":"𫍺","𧬤":"𫍼","𧭈":"𫍾","𧭹":"𫍐","𧳟":"𧳕","𧵳":"䞌","𧶔":"𧹓","𧶧":"䞎","𧷎":"𪠀","𧸘":"𫎨","𧹈":"𪥠","𧽯":"𫎸","𨂐":"𫏌","𨄣":"𨀱","𨅍":"𨁴","𨆪":"𫏕","𨇁":"𧿈","𨇞":"𨅫","𨇤":"𫏨","𨇰":"𫏞","𨇽":"𫏑","𨈊":"𨂺","𨈌":"𨄄","𨊰":"䢀","𨊸":"䢁","𨊻":"𨐆","𨋢":"䢂","𨌈":"𫐍","𨍰":"𫐔","𨎌":"𫐋","𨎮":"𨐉","𨏠":"𨐇","𨏥":"𨐊","𨞺":"𫟫","𨟊":"𫟬","𨢿":"𨡙","𨣈":"𨡺","𨣞":"𨟳","𨣧":"𨠨","𨤻":"𨤰","𨥛":"𨱀","𨥟":"𫓫","𨦫":"䦀","𨧀":"𬭊","𨧜":"䦁","𨧰":"𫟽","𨧱":"𨱊","𨨏":"𬭛","𨨛":"𫓼","𨨢":"𫓽","𨩰":"𫟾","𨪕":"𫓮","𨫒":"𨱐","𨬖":"𫔏","𨭆":"𬭶","𨭎":"𬭳","𨭖":"𫔑","𨭸":"𫔐","𨮂":"𨱕","𨮳":"𫔒","𨯅":"䥿","𨯟":"𫔓","𨰃":"𫔉","𨰋":"𫓳","𨰥":"𫔕","𨰲":"𫔃","𨲳":"𫔖","𨳑":"𨸁","𨳕":"𨸀","𨴗":"𨸅","𨴹":"𫔲","𨵩":"𨸆","𨵸":"𨸇","𨶀":"𨸉","𨶏":"𨸊","𨶮":"𨸌","𨶲":"𨸋","𨷲":"𨸎","𨼳":"𫔽","𨽏":"𨸘","𩀨":"𫕚","𩅙":"𫕨","𩎖":"𫖑","𩎢":"𩏾","𩏂":"𫖓","𩏠":"𫖖","𩏪":"𩏽","𩏷":"𫃗","𩑔":"𫖪","𩒎":"𫖭","𩓣":"𩖕","𩓥":"𫖵","𩔑":"𫖷","𩔳":"𫖴","𩖰":"𫠇","𩗀":"𩙦","𩗓":"𫗈","𩗴":"𫗉","𩘀":"𩙩","𩘝":"𩙭","𩘹":"𩙨","𩘺":"𩙬","𩙈":"𩙰","𩚛":"𩟿","𩚥":"𩠀","𩚩":"𫗡","𩚵":"𩠁","𩛆":"𩠂","𩛌":"𫗤","𩛡":"𫗨","𩛩":"𩠃","𩜇":"𩠉","𩜦":"𩠆","𩜵":"𩠊","𩝔":"𩠋","𩝽":"𫗳","𩞄":"𩠎","𩞦":"𩠏","𩞯":"䭪","𩟐":"𩠅","𩟗":"𫗚","𩠴":"𩠠","𩡣":"𩡖","𩡺":"𩧦","𩢡":"𩧬","𩢴":"𩧵","𩢸":"𩧳","𩢾":"𩧮","𩣏":"𩧶","𩣑":"䯃","𩣫":"𩧸","𩣵":"𩧻","𩣺":"𩧼","𩤊":"𩧩","𩤙":"𩨆","𩤲":"𩨉","𩤸":"𩨅","𩥄":"𩨋","𩥇":"𩨍","𩥉":"𩧱","𩥑":"𩨌","𩦠":"𫠌","𩧆":"𩨐","𩭙":"𩬣","𩯁":"𫙂","𩯳":"𩯒","𩰀":"𩬤","𩰹":"𩰰","𩳤":"𩲒","𩴵":"𩴌","𩵦":"𫠏","𩵩":"𩽺","𩵹":"𩽻","𩶁":"𫚎","𩶘":"䲞","𩶰":"𩽿","𩶱":"𩽽","𩷰":"𩾄","𩸃":"𩾅","𩸄":"𫚝","𩸡":"𫚟","𩸦":"𩾆","𩻗":"𫚨","𩻬":"𫚩","𩻮":"𫚘","𩼶":"𫚬","𩽇":"𩾎","𩿅":"𫠖","𩿤":"𫛠","𩿪":"𪉄","𪀖":"𫛧","𪀦":"𪉅","𪀾":"𪉋","𪁈":"𪉉","𪁖":"𪉌","𪂆":"𪉎","𪃍":"𪉐","𪃏":"𪉏","𪃒":"𫛻","𪃧":"𫛹","𪄆":"𪉔","𪄕":"𪉒","𪅂":"𫜂","𪆷":"𫛾","𪇳":"𪉕","𪈼":"𱊜","𪉸":"𫜊","𪋿":"𫧮","𪌭":"𫜓","𪍠":"𫜕","𪓰":"𫜟","𪔵":"𪔭","𪘀":"𪚏","𪘯":"𪚐","𪙏":"𫜯","𪟖":"𠛾","𪷓":"𣶭","𫒡":"𫓷","𫜦":"𫜫"};function tranStr(str,toT){var i,letter,code,src,result="";if(src=toT?s2tData:t2sData,"string"!=typeof str)return str;for(i=0;i13312&&code<40899||code>63744&&code<64106)){result+=letter;continue}let target=src[letter];result+=target||letter}return result}var Chinese_s2t=function(str){return tranStr(str,!0)},Chinese_t2s=function(str){return tranStr(str,!1)};const insertAfter=(newNode,existingNode)=>{void 0!==existingNode.nextSibling?existingNode.parentNode.insertBefore(newNode,existingNode.nextSibling):existingNode.parentNode.appendChild(newNode)},HalfBold=parentElement=>{for(var i=0;void 0!==parentElement.childNodes[i];i++)if("#text"===parentElement.childNodes[i].nodeName&&0!==parentElement.childNodes[i].textContent.trim().length){var recentNode=parentElement.childNodes[i],newNodeCount=0;parentElement.childNodes[i].textContent.split(/(\s+|\S+)/).forEach(word=>{if(0===word.length)return;var trimmedWordLength=word.trim().length;if(0===trimmedWordLength){let textNode=document.createTextNode(word);return insertAfter(textNode,recentNode),newNodeCount++,void(recentNode=textNode)}var length=Math.floor(trimmedWordLength/2);0===length&&(length=1);const bold=document.createElement("b");if(bold.textContent=word.slice(0,length),insertAfter(bold,recentNode),newNodeCount++,recentNode=bold,1===word.length)return;let textNode=document.createTextNode(word.slice(length));insertAfter(textNode,recentNode),newNodeCount++,recentNode=textNode}),parentElement.removeChild(parentElement.childNodes[i]),i+=newNodeCount-1}};var ignoreTags={B:!0,META:!0,LINK:!0,SCRIPT:!0,STYLE:!0};const processDocumentBody=element=>{if(null!==element&&void 0!==element.body)for(var collection=element.body.getElementsByTagName("*"),i=0;void 0!==collection[i];i++)if(!ignoreTags[collection[i].nodeName]&&1===collection[i].nodeType)if("IFRAME"===collection[i].nodeName)processDocumentBody(collection[i].contentDocument);else{if(0===collection[i].childNodes.length)continue;HalfBold(collection[i])}},classes=["color-0","color-1","color-2","color-3","line-0","line-1","line-2","line-3"],colors=["#FEF3CD","#FBFACC","#CEFACD","#CDE9FA"],lines=["#FF0000","#000080","#0000FF","#2EFF2E"],buildHighlightStyleForType=(colorCode,forPDFOverlay,isVertical)=>{let styleType="background",rawColor="#FEF3CD";if("number"==typeof colorCode){if(colorCode>=0&&colorCode-1,colorIdx=parseInt(classes[colorCode].split("-")[1]);styleType=isBackground?"background":"underline",rawColor=isBackground?colors[colorIdx]:lines[colorIdx]}}else styleType=colorCode.split("-")[0],rawColor=colorCode.split("-")[1];const color="background"===styleType?hexToRgba(rawColor,.8):rawColor;switch(styleType){case"background":return forPDFOverlay?`background: ${color}; mix-blend-mode: multiply;`:`background: ${color};`;case"underline":return forPDFOverlay?isVertical?`border-right: 2px solid ${color};`:`border-bottom: 2px solid ${color};`:`text-decoration: underline; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"strikethrough":return forPDFOverlay?`background: linear-gradient(transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:isVertical?`background: linear-gradient(to right, transparent calc(50% - 1px), ${color} calc(50% - 1px), ${color} calc(50% + 1px), transparent calc(50% + 1px));`:`text-decoration: line-through; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;case"wavy":const encodedColor=rawColor.replace("#","%23");if(forPDFOverlay){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='6' height='3'%3E%3Cpath d='M0 2 Q1.5 0 3 2 Q4.5 4 6 2' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-x; background-position: bottom; background-size: 6px 3px;`}if(isVertical){return`background-image: ${`url("data:image/svg+xml,%3Csvg xmlns='http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg' width='3' height='6'%3E%3Cpath d='M2 0 Q0 1.5 2 3 Q4 4.5 2 6' fill='none' stroke='${encodedColor}' stroke-width='1.5'%2F%3E%3C%2Fsvg%3E")`}; background-repeat: repeat-y; background-position: right; background-size: 3px 6px;`}return`text-decoration-line: underline; text-decoration-style: wavy; text-decoration-color: ${color}; text-decoration-thickness: 2px; text-decoration-skip-ink: none;`;default:return`background: ${color};`}},hexToRgba=(hexColor,alpha)=>{const hex=hexColor.replace("#",""),normalized=3===hex.length?hex.split("").map(ch=>ch+ch).join(""):hex;if(6!==normalized.length)return hexColor;return`rgba(${parseInt(normalized.slice(0,2),16)}, ${parseInt(normalized.slice(2,4),16)}, ${parseInt(normalized.slice(4,6),16)}, ${alpha})`},isElectron$1=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0),getBlockElement=Element=>Array.from(Element.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,li,dt,dd,pre,blockquote,address,kookitmarker")),isParentBlock=myDiv=>{var children=myDiv.children;let flag=!1;for(var blockRegex=/^(address|kookitmarker|section|blockquote|body|center|dir|div|dl|fieldset|form|h[1-6]|hr|isindex|menu|noframes|noscript|ol|p|pre|table|ul|dd|dt|frameset|li|tbody|td|tfoot|th|thead|tr|html)$/i,i=0;i(v||"").trim());return 0===entries.length?"":entries.map(([k,v])=>`${k}: ${v}`).join("; ")}(Object.assign(Object.assign({},base),extra))}function getStylePxNumber(styleText,prop){if(!styleText||!prop)return null;const val=parseStyleToMap(styleText)[prop.toLowerCase()];if(!val)return null;const m=val.replace(/\s*!important\s*$/i,"").trim().match(/^(-?\d+(?:\.\d+)?)(?:px)?$/i);if(!m)return null;const num=parseFloat(m[1]);return Number.isFinite(num)&&num>0?num:null}const detectLocalLanguage$1=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},REJECTED_CLASSES=["kookit-note","kookit-note-icon","kookit-word-def","kookit-note-tooltip","kookit-word-tooltip","kookit-text-rule-replace","kookit-text-rule-delete","kookit-text-rule-highlight","kookit-translation-host"],expandReplacement=(replacement,match)=>replacement.replace(/\$(\$|\d+)/g,(_m,group)=>{var _a;if("$"===group)return"$";const index=parseInt(group,10);return null!==(_a=match[index])&&void 0!==_a?_a:""}),collectTextNodes=(doc,root)=>{const walker=doc.createTreeWalker(root,NodeFilter.SHOW_TEXT,{acceptNode:node=>(node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag)return!0;for(let i=0;i{var _a;const text=textNode.textContent||"";if(regex.lastIndex=0,!regex.test(text))return;regex.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=regex.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const matchedText=match[0],span=doc.createElement("span");if("replace"===rule.type){span.className="kookit-text-rule-replace";const replacement="regex"===rule.matchType?expandReplacement(rule.replacement||"",match):rule.replacement||"";span.setAttribute("data-kookit-replacement",replacement)}else if("delete"===rule.type)span.className="kookit-text-rule-delete";else if("highlight"===rule.type&&(span.className="kookit-text-rule-highlight",rule.highlightStyle&&rule.highlightColor)){const colorCode=`${rule.highlightStyle}-${rule.highlightColor}`,inlineStyle=buildHighlightStyleForType(colorCode,!1,!1);span.setAttribute("style",inlineStyle)}span.appendChild(doc.createTextNode(matchedText)),fragment.appendChild(span),lastIndex=match.index+matchedText.length,0===matchedText.length&®ex.lastIndex++}if(0===lastIndex)return;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)},applyRule=(doc,rule)=>{const elements=doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker"),regex="regex"===rule.matchType?new RegExp(rule.pattern,"g"):new RegExp(rule.pattern.replace(/[.*+?^${}()|[\]\\]/g,"\\$&"),"g");for(let i=0;i"vertical"===window.textOrientation,convertStyleNum=value=>value?parseFloat(value+""):0,getActualOffsetLeft=child=>{var _a;if(child){return child.getBoundingClientRect().left-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().left)||0)}return 0},getActualOffsetTop=child=>{var _a;if(child){return child.getBoundingClientRect().top-((null===(_a=child.offsetParent)||void 0===_a?void 0:_a.getBoundingClientRect().top)||0)}return 0},handleOneChapterDoc=(item,isSearch)=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item&&item.load){let chapteruUrl=yield item.load(),res=yield fetch(chapteruUrl),blob=yield res.blob();chapterText=yield blob.text()}return isSearch||(chapterText=yield handlePrecacheAssets(chapterText,item)),chapterText}),getImageElement=Element=>Array.from(Element.querySelectorAll("img, image")),getImageUrl=el=>el.getAttribute("src")||el.getAttribute("href")||el.getAttribute("xlink:href")||null,collectChapterImageUrls=root=>{const urls=[],nodes=root.querySelectorAll("img, svg, image");for(const el of nodes){const tag=el.tagName.toLowerCase();if("img"===tag){const url=getImageUrl(el);url&&urls.push(url)}else if("svg"===tag)el.querySelectorAll("image").forEach(img=>{if(img.closest("svg")!==el)return;const url=getImageUrl(img);url&&urls.push(url)});else if("image"===tag&&!el.closest("svg")){const url=getImageUrl(el);url&&urls.push(url)}}return urls},handlePrecacheAssets=(bookStr,item)=>__awaiter(void 0,void 0,void 0,function*(){var _a;let chapterDoc=(new DOMParser).parseFromString(bookStr,"text/html");if(item&&item.loadAsset){let loadAsset=item.loadAsset,imgDomList=getImageElement(chapterDoc);for(let subindex=0;subindex!isParentBlock(item));for(let node of nodeList)if(node.textContent&&(null===(_a=node.textContent)||void 0===_a?void 0:_a.trim())){let id=node.getAttribute("id")||"kookit-trans-"+Math.random().toString(36).substr(2,9);window.transMap[node.textContent]&&(id=window.transMap[node.textContent].id),node.setAttribute("id",id),node.classList.add("kookit-translation-host"),node.classList.add("kookit-translation-loading"),node.setAttribute("data-kookit-translation","");let originalText=node.textContent||"";window.transMap[originalText]={id:id}}}let imgDomList=getImageElement(chapterDoc);if(imgDomList.length>0){for(let i=0;i{var _a,iframe=document.createElement("iframe");iframe.style.width=scale?100*(scale-.4)+"%":"100%",iframe.style.margin="0",iframe.style.border="0",iframe.style.padding="0",iframe.style.minHeight="calc(100% - 2px)",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="kookit-iframe",iframe.style.verticalAlign="baseline","yes"!==isAllowScript&&iframe.setAttribute("sandbox","allow-same-origin"),element.innerHTML="",element.appendChild(iframe);const doc=iframe.contentDocument||(null===(_a=iframe.contentWindow)||void 0===_a?void 0:_a.document);doc&&doc.documentElement&&(doc.documentElement.lang="en"),scale&&(element.scrollLeft=element.scrollWidth/2-element.clientWidth/2)},progressInfo=(readerMode,doc,element)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return{totalPage:"single"===readerMode?Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")):2*Math.round(parseFloat(doc.body.scrollHeight/(doc.body.clientHeight+gap)+"")),currentPage:Math.round(parseFloat(convertStyleNum(doc.body.scrollTop)/(doc.body.clientHeight+gap)+""))+1}}let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return{totalPage:"scroll"===readerMode?Math.floor(element.scrollHeight/(element.clientHeight-50)):"single"===readerMode?Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")):2*Math.round(parseFloat(doc.body.scrollWidth/(doc.body.clientWidth+gap)+"")),currentPage:"scroll"===readerMode?Math.floor(element.scrollTop/(element.clientHeight-50))+1:Math.round(parseFloat(convertStyleNum(doc.body.scrollLeft)/(doc.body.clientWidth+gap)+""))+1}},fetchHighlightAsset=path=>__awaiter(void 0,void 0,void 0,function*(){const url=`${isElectron$1()?".":""}/lib/highlight-js/${path}`;return yield(yield fetch(url)).text()}),runHighlightScript=source=>{const script=document.createElement("script");script.textContent=source,document.head.appendChild(script)},applyCodeHighlighting=(doc,language)=>__awaiter(void 0,void 0,void 0,function*(){if(yield(language=>__awaiter(void 0,void 0,void 0,function*(){window.hljs||runHighlightScript(yield fetchHighlightAsset("highlight.min.js")),window.kookitHljsLanguage!==language&&(runHighlightScript(yield fetchHighlightAsset(`languages/${language}.min.js`)),window.kookitHljsLanguage=language)}))(language),!doc.head.querySelector("#kookit-code-highlighter-style")){const style=document.createElement("style");style.id="kookit-code-highlighter-style",style.textContent=yield fetchHighlightAsset("default.min.css"),doc.head.appendChild(style)}const langClass="language-"+language;(doc=>Array.from(doc.querySelectorAll("code")))(doc).forEach(element=>{element.classList.add(langClass),delete element.dataset.highlighted,window.hljs.highlightElement(element)})}),transformText=doc=>__awaiter(void 0,void 0,void 0,function*(){if(window.bookLayout){const cssPath=()=>`${isElectron$1()?".":""}/lib/${window.bookLayout}-css/${window.bookLayout}.min.css`,fetchText=url=>__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()}),textCSS=()=>__awaiter(void 0,void 0,void 0,function*(){return yield fetchText(cssPath())}),style=document.createElement("style");style.id="kookit-book-layout-style",style.textContent=yield textCSS(),doc.head.appendChild(style),doc.body.classList.contains(window.bookLayout)||doc.body.classList.add(window.bookLayout)}"Simplified To Traditional"===window.convertChinese?doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_s2t(item)).join("")}):"Traditional To Simplified"===window.convertChinese&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker").forEach(item=>{item.innerHTML=item.innerHTML.split("").map(item=>Chinese_t2s(item)).join("")}),"yes"===window.isIndent&&doc.querySelectorAll("h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address").forEach(item=>{for(let node of item.childNodes){if(node.nodeType===Node.TEXT_NODE){const firstChar=(node.nodeValue||"").charAt(0);firstChar&&""===firstChar.trim()&&" "!==firstChar&&"\n"!==firstChar&&"\t"!==firstChar&&item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}if(node.nodeType===Node.ELEMENT_NODE&&"img"===node.tagName.toLowerCase()){item.setAttribute("style",(item.getAttribute("style")||"")+"text-indent: 0em !important;");break}}}),"yes"===window.isBionic&&processDocumentBody(doc),window.codeHighlight&&(yield applyCodeHighlighting(doc,window.codeHighlight)),window.textRules&&window.textRules.length>0&&((doc,rules)=>{(doc=>{const spans=doc.querySelectorAll(".kookit-text-rule-replace, .kookit-text-rule-delete, .kookit-text-rule-highlight");for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){yield transformText(doc)}),handleImageSize=(element,readerMode,format,doc)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1,pageWidth=(element.clientWidth-gap)/scale,imgs=Array.from(doc.querySelectorAll("img, image"));yield Promise.all(imgs.map(item=>__awaiter(void 0,void 0,void 0,function*(){if("image"===item.tagName&&!item._naturalWidth){let img=yield(url=item.getAttribute("xlink:href"),__awaiter(void 0,void 0,void 0,function*(){const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}return img}));item._naturalWidth=img.naturalWidth,item._naturalHeight=img.naturalHeight}var url})));const elementClientWidth=element.clientWidth,elementClientHeight=element.clientHeight,bodyClientHeight=doc.body.clientHeight,getContentWidth=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientWidth,pageWidth)-parseFloat(style.paddingLeft)-parseFloat(style.paddingRight)},getContentHeight=el=>{if(!el)return 0;const style=getComputedStyle(el);return Math.min(el.clientHeight,elementClientHeight)-parseFloat(style.paddingTop)-parseFloat(style.paddingBottom)},writes=imgs.map(item=>{const parentItem=item.parentElement,grandItem=null==parentItem?void 0:parentItem.parentElement;let width=item.getAttribute("width"),height=item.getAttribute("height");return!width&&item.getAttribute("style")&&(width=getStylePxNumber(item.getAttribute("style"),"width")),!height&&item.getAttribute("style")&&(height=getStylePxNumber(item.getAttribute("style"),"height")),width||(width="image"===item.tagName?item._naturalWidth:item.naturalWidth),height||(height="image"===item.tagName?item._naturalHeight:item.naturalHeight),{item:item,width:width||0,height:height||0,parentOffsetWidth:(null==parentItem?void 0:parentItem.offsetWidth)||0,parentClientWidth:getContentWidth(parentItem),parentClientHeight:getContentHeight(parentItem),grandClientWidth:getContentWidth(grandItem),grandClientHeight:getContentHeight(grandItem),grandTagName:(null==grandItem?void 0:grandItem.tagName)||"",existingStyle:item.getAttribute("style")||""}}).map(m=>{var _a;const{item:item,width:width,height:height,parentOffsetWidth:parentOffsetWidth,parentClientWidth:parentClientWidth,parentClientHeight:parentClientHeight,grandClientWidth:grandClientWidth,grandClientHeight:grandClientHeight,grandTagName:grandTagName}=m;let maxHeight=0,maxWidth=0,setParentIndent=!1,setGrandIndent=!1;if(format.startsWith("CB")&&"scroll"===readerMode)maxWidth=parentOffsetWidth;else if(format.startsWith("CB")&&"single"===readerMode)maxHeight=elementClientHeight,maxWidth=elementClientWidth;else if(parentClientWidth&&parentClientHeight&&width&&height){height/width>parentClientHeight/parentClientWidth?(maxHeight=parentClientHeight,maxWidth=parseInt(maxHeight*width/height+"")):(maxWidth=parentClientWidth,maxHeight=parseInt(maxWidth*height/width+"")),maxHeight>bodyClientHeight&&"scroll"!==readerMode&&(maxWidth=parseInt(maxWidth*(bodyClientHeight/maxHeight)+""),maxHeight=bodyClientHeight),setParentIndent=!0}else parentClientWidth>0?(maxWidth=parentClientWidth,maxHeight=parentClientHeight,setParentIndent=!0):"BODY"!==grandTagName&&grandClientWidth>0?(maxWidth=grandClientWidth,maxHeight=grandClientHeight,setGrandIndent=!0):(maxWidth=elementClientWidth,maxHeight=elementClientHeight);maxWidth=maxWidth?Math.min("scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,maxWidth):"scroll"===readerMode||"single"===readerMode?elementClientWidth:pageWidth,width&&height&&(width>height||maxHeight/maxWidth>height/width?maxHeight=maxWidth*(height/width):maxWidth=maxHeight*(width/height)),"scroll"!==readerMode&&maxWidth&&maxHeight&&maxHeight>elementClientHeight&&(maxWidth*=elementClientHeight/maxHeight,maxHeight=elementClientHeight);const styles=[];return(maxWidth||maxHeight)&&styles.push(`max-width: ${maxWidth>0?maxWidth+"px":""};max-height:${maxHeight>0?maxHeight+"px":""}; margin: 0 auto; min-width: 0px; min-height: 0px;`),format.startsWith("CB")&&"scroll"===readerMode&&styles.push("margin-left: 0px; width: 100%;"),{item:item,styles:styles,isSvgImage:"image"===item.tagName,maxWidth:maxWidth,maxHeight:maxHeight,parentItem:item.parentElement,grandItem:null===(_a=item.parentElement)||void 0===_a?void 0:_a.parentElement,setParentIndent:setParentIndent,setGrandIndent:setGrandIndent}});for(let i=0;i0&&i%20==0&&(yield new Promise(r=>setTimeout(r,0)));const w=writes[i],{item:item,styles:styles,isSvgImage:isSvgImage,maxWidth:maxWidth,maxHeight:maxHeight}=w;if(w.setParentIndent&&w.parentItem&&(w.parentItem.style.textIndent="0px"),w.setGrandIndent&&w.grandItem&&(w.grandItem.style.textIndent="0px"),styles.length>0){const existing=item.getAttribute("style")||"";item.setAttribute("style",existing+";"+styles.join(";"))}if(isSvgImage&&(null===(_b=item.parentElement)||void 0===_b||_b.setAttribute("width",maxWidth),null===(_c=item.parentElement)||void 0===_c||_c.setAttribute("height",maxHeight)),format.startsWith("CB")&&"scroll"!==readerMode){const liveWidth=item.getBoundingClientRect().width,existing=item.getAttribute("style")||"";item.setAttribute("style",existing+`;margin-left: calc(50% - ${liveWidth/2}px);`)}}}),handleLayout=(element,readerMode,doc)=>{let style=doc.createElement("style");style.id="default-style",style.textContent="body{margin: 0px}",doc.head.appendChild(style);const vertical=isVerticalLayout();if("scroll"===readerMode)return;let scale="double"===readerMode?2:1;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`writing-mode: vertical-rl; text-orientation: mixed; height: ${element.clientHeight+"px"};width: 100%;overflow-y: hidden;overflow-x: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientHeight-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;doc.documentElement.setAttribute("style",`width: ${element.clientWidth+"px"};height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action:none; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(element.clientWidth-gap)/scale}px;`),doc.body.setAttribute("style","margin: 0px !important; padding: 0px !important;")}};function getSelectedElement(doc){const selection=doc.getSelection();if(!selection)return null;if(selection.rangeCount>0){return selection.getRangeAt(0).startContainer.parentElement}return null}const applyHyphenation=doc=>{var _a;if(!doc||!doc.body)return;const SKIP_TAGS=new Set(["CODE","PRE","SCRIPT","STYLE","KBD","SAMP","A"]);function getBreakpoints(word){const len=word.length,points=[];for(let i=2;i=3&&(i+1)%6==0&&points.push(i+1);return points}const WORD_RE=/[A-Za-zÀ-ɏ]{9,}/g,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT,{acceptNode(node){var _a,_b;const parent=node.parentElement;return parent?SKIP_TAGS.has(null===(_a=parent.tagName)||void 0===_a?void 0:_a.toUpperCase())||(null===(_b=parent.classList)||void 0===_b?void 0:_b.contains("kookit-hyphen"))?NodeFilter.FILTER_REJECT:NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT}}),nodes=[];let node;for(;node=walker.nextNode();)nodes.push(node);for(const textNode of nodes){const text=textNode.textContent||"";if(WORD_RE.lastIndex=0,!WORD_RE.test(text))continue;WORD_RE.lastIndex=0;const matches=[];let m;for(;null!==(m=WORD_RE.exec(text));){const breaks=getBreakpoints(m[0]);breaks.length&&matches.push({start:m.index,end:m.index+m[0].length,breaks:breaks})}if(!matches.length)continue;const parent=textNode.parentNode;if(!parent)continue;const allBreaks=[];for(const mt of matches)for(const b of mt.breaks)allBreaks.push(mt.start+b);allBreaks.sort((a,b)=>a-b);let current=textNode;for(const absOffset of allBreaks){const curLen=(null===(_a=current.textContent)||void 0===_a?void 0:_a.length)||0;if(absOffset<=0||absOffset>=curLen)continue;const after=current.splitText(absOffset),marker=doc.createElement("span");marker.className="kookit-hyphen",parent.insertBefore(marker,after),current=after}}},isString=value=>"string"==typeof value||value instanceof String;class GeneralParser{constructor(book){this.book=book,this.chapterList=[],this.flattenChapters=[],this.chapterDocList=[]}unescapeHtml(htmlStr){if(!htmlStr)return"";return(new DOMParser).parseFromString(htmlStr,"text/html").documentElement.textContent||""}getChapter(toc){return __awaiter(this,void 0,void 0,function*(){return this.chapterList=toc?yield Promise.all(toc.map((item,index)=>__awaiter(this,void 0,void 0,function*(){let chapterIndex=index;try{if(item.href){const resolved=yield this.book.resolveHrefIndex(item.href);resolved&&(chapterIndex=resolved.index)}}catch(error){console.error(error)}return{label:this.unescapeHtml(item.label)?this.unescapeHtml(item.label):chapterIndex+"",href:item.href?item.href:"title"+chapterIndex,index:chapterIndex,subitems:item.subitems?yield this.getChapter(item.subitems):[]}}))):yield Promise.all(this.book.sections.map((item,index)=>__awaiter(this,void 0,void 0,function*(){return{label:item&&item.label&&this.unescapeHtml(item.label)?this.unescapeHtml(item.label):index+"",href:item&&item.href?item.href:"title"+index,index:index,subitems:item&&item.subitems?yield this.getChapter(item.subitems):[]}}))),this.flattenChapters=this.flatChapter(this.chapterList),this.chapterList})}getChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const chapterIndexList=this.flattenChapters.map(item=>item.index);return this.book.sections.map((item,index)=>chapterIndexList.indexOf(index)>-1?{label:this.unescapeHtml(this.flattenChapters[chapterIndexList.indexOf(index)].label),href:this.flattenChapters[chapterIndexList.indexOf(index)].href,text:item}:{label:"",href:"",text:item})})}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return newChapter}getMetadata(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){const metadata=this.book.metadata;let author=metadata.author&&metadata.author[0]&&metadata.author[0].name&&isString(metadata.author[0].name)?metadata.author[0].name:metadata.author&&metadata.author[0]&&isString(metadata.author[0])?metadata.author[0]:metadata.author&&isString(metadata.author)?metadata.author:"";try{const blob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(blob),reader.onloadend=()=>{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:reader.result}))}}catch(error){console.error(error);try{resolve(Object.assign(Object.assign({},metadata),{name:metadata.title,author:author,description:metadata.description,publisher:metadata.publisher,cover:""}))}catch(error){console.error(error),reject(error)}}}))}}const splitAt=(arr,is)=>[-1,...is,arr.length].reduce(({xs:xs,a:a},b)=>({xs:xs?.concat([arr.slice(a+1,b)])??[],a:b}),{}).xs,isNumber=/\d/,isCFI=/^epubcfi\((.*)\)$/,escapeCFI=str=>str.replace(/[\^[\](),;=]/g,"^$&"),findTokens=(tokens,x)=>{return f=([t])=>t===x,tokens.map((x,i,a)=>f(x,i,a)?i:null).filter(x=>null!=x);var f},parser=tokens=>{const parts=[];let state;for(const[type,val]of tokens){if("/"===type)parts.push({index:val});else{const last=parts[parts.length-1];if(":"===type)last.offset=val;else if("~"===type)last.temporal=val;else if("@"===type)last.spatial=(last.spatial??[]).concat(val);else if(";s"===type)last.side=val;else if("["===type){if("/"!==state||!val){last.text=(last.text??[]).concat(val);continue}last.id=val}}state=type}return parts},parserIndir=tokens=>splitAt(tokens,findTokens(tokens,"!")).map(parser),parse=cfi=>{const tokens=(str=>{const tokens=[];let state,escape,value="";const push=x=>(tokens.push(x),state=null,value=""),cat=x=>(value+=x,escape=!1);for(const char of Array.from(str.trim()).concat(""))if("^"!==char||escape){if("!"===state)push(["!"]);else if(","===state)push([","]);else if("/"===state||":"===state){if(isNumber.test(char)){cat(char);continue}push([state,parseInt(value)])}else if("~"===state){if(isNumber.test(char)||"."===char){cat(char);continue}push(["~",parseFloat(value)])}else if("@"===state){if(":"===char){push(["@",parseFloat(value)]),state="@";continue}if(isNumber.test(char)||"."===char){cat(char);continue}push(["@",parseFloat(value)])}else{if("["===state){";"!==char||escape?","!==char||escape?"]"!==char||escape?cat(char):push(["[",value]):(push(["[",value]),state="["):(push(["[",value]),state=";");continue}if(state?.startsWith(";")){"="!==char||escape?";"!==char||escape?"]"!==char||escape?cat(char):push([state,value]):(push([state,value]),state=";"):(state=`;${value}`,value="");continue}}"/"!==char&&":"!==char&&"~"!==char&&"@"!==char&&"["!==char&&"!"!==char&&","!==char||(state=char)}else escape=!0;return tokens})((x=cfi,x.match(isCFI)?.[1]??x));var x;const commas=findTokens(tokens,",");if(!commas.length)return parserIndir(tokens);const[parent,start,end]=splitAt(tokens,commas).map(parserIndir);return{parent:parent,start:start,end:end}},partToString=({index:index,id:id,offset:offset,temporal:temporal,spatial:spatial,text:text,side:side})=>{const param=side?`;s=${side}`:"";return`/${index}`+(id?`[${escapeCFI(id)}${param}]`:"")+(null!=offset&&index%2?`:${offset}`:"")+(temporal?`~${temporal}`:"")+(spatial?`@${spatial.join(":")}`:"")+(text||!id&&side?"["+(text?.map(escapeCFI)?.join(",")??"")+param+"]":"")},toInnerString=parsed=>parsed.parent?[parsed.parent,parsed.start,parsed.end].map(toInnerString).join(","):parsed.map(parts=>parts.map(partToString).join("")).join("!"),toString=parsed=>{return x=toInnerString(parsed),isCFI.test(x)?x:`epubcfi(${x})`;var x},collapse=(x,toEnd)=>{return"string"==typeof x?toString(collapse(parse(x),toEnd)):x.parent?(a=x.parent,b=x[toEnd?"end":"start"],a.slice(0,-1).concat([a[a.length-1].concat(b[0])]).concat(b.slice(1))):x;var a,b},isTextNode=({nodeType:nodeType})=>3===nodeType||4===nodeType,isElementNode=({nodeType:nodeType})=>1===nodeType,indexChildNodes=node=>{const nodes=Array.from(node.childNodes).filter(node=>isTextNode(node)||isElementNode(node)).reduce((arr,node)=>{let last=arr[arr.length-1];return last?isTextNode(node)?Array.isArray(last)?last.push(node):isTextNode(last)?arr[arr.length-1]=[last,node]:arr.push(node):isElementNode(last)?arr.push(null,node):arr.push(node):arr.push(node),arr},[]);return isElementNode(nodes[0])&&nodes.unshift("first"),isElementNode(nodes[nodes.length-1])&&nodes.push("last"),nodes.unshift("before"),nodes.push("after"),nodes},getNodeByIndex=(node,index)=>node?indexChildNodes(node)[index]:null,partsToNode=(node,parts)=>{const{id:id}=parts[parts.length-1];if(id){const el=node.ownerDocument.getElementById(id);if(el)return{node:el,offset:0}}for(const{index:index}of parts){const newNode=getNodeByIndex(node,index);if("first"===newNode)return{node:node.firstChild??node};if("last"===newNode)return{node:node.lastChild??node};if("before"===newNode)return{node:node,before:!0};if("after"===newNode)return{node:node,after:!0};node=newNode}const{offset:offset}=parts[parts.length-1];if(!Array.isArray(node))return{node:node,offset:offset};let sum=0;for(const n of node){const{length:length}=n.nodeValue;if(sum+length>=offset)return{node:n,offset:offset-sum};sum+=length}},nodeToParts=(node,offset)=>{const{parentNode:parentNode,id:id}=node,indexed=indexChildNodes(parentNode),index=indexed.findIndex(x=>Array.isArray(x)?x.some(x=>x===node):x===node),chunk=indexed[index];if(Array.isArray(chunk)){let sum=0;for(const x of chunk){if(x===node){sum+=offset;break}sum+=x.nodeValue.length}offset=sum}const part={id:id,index:index,offset:offset};return parentNode!==node.ownerDocument.documentElement?nodeToParts(parentNode).concat(part):[part]},toElement=(doc,parts)=>partsToNode(doc.documentElement,collapse(parts)).node,NS$1_CONTAINER="urn:oasis:names:tc:opendocument:xmlns:container",NS$1_XHTML="http://www.w3.org/1999/xhtml",NS$1_OPF="http://www.idpf.org/2007/opf",NS$1_EPUB="http://www.idpf.org/2007/ops",NS$1_DC="http://purl.org/dc/elements/1.1/",NS$1_ENC="http://www.w3.org/2001/04/xmlenc#",NS$1_NCX="http://www.daisy.org/z3986/2005/ncx/",NS$1_XLINK="http://www.w3.org/1999/xlink",NS$1_SMIL="http://www.w3.org/ns/SMIL",MIME$2={XML:"application/xml",NCX:"application/x-dtbncx+xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml",JS:/\/(x-)?(javascript|ecmascript)/},camel=x=>x.toLowerCase().replace(/[-:](.)/g,(_,g)=>g.toUpperCase()),filterAttribute=(attr,value,isList)=>isList?el=>el.getAttribute(attr)?.split(/\s/)?.includes(value):"function"==typeof value?el=>value(el.getAttribute(attr)):el=>el.getAttribute(attr)===value,getAttributes=(...xs)=>el=>el?Object.fromEntries(xs.map(x=>[camel(x),el.getAttribute(x)])):null,getElementText$1=el=>{return str=el?.textContent,str?str.trim().replace(/\s{2,}/g," "):"";var str},childGetter=(doc,ns)=>{const useNS=doc.lookupNamespaceURI(null)===ns||doc.lookupPrefix(ns),f=useNS?(el,name)=>el=>el.namespaceURI===ns&&el.localName===name:(el,name)=>el=>el.localName===name;return{$:(el,name)=>[...el.children].find(f(el,name)),$$:(el,name)=>[...el.children].filter(f(el,name)),$$$:useNS?(el,name)=>[...el.getElementsByTagNameNS(ns,name)]:(el,name)=>[...el.getElementsByTagName(ns,name)]}},resolveURL=(url,relativeTo)=>{try{url=url.replace(/%2c/gi,",").replace(/%3a/gi,":");const root="whatever://whatever/";return decodeURI(new URL(url,root+relativeTo).href.replace(root,""))}catch(e){return console.warn(e),url}},isExternal=uri=>/^(?!blob)\w+:/i.test(uri),replaceSeries$1=async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())},regexEscape=str=>str.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),LANGS={attrs:["dir","xml:lang"]},ALTS={name:"alternate-script",many:!0,...LANGS,props:["file-as"]},CONTRIB={many:!0,...LANGS,props:[{name:"role",many:!0,attrs:["scheme"]},"file-as",ALTS]},METADATA=[{name:"title",many:!0,...LANGS,props:["title-type","display-seq","file-as",ALTS]},{name:"identifier",many:!0,props:[{name:"identifier-type",attrs:["scheme"]}]},{name:"language",many:!0},{name:"creator",...CONTRIB},{name:"contributor",...CONTRIB},{name:"publisher",...LANGS,props:["file-as",ALTS]},{name:"description",...LANGS,props:[ALTS]},{name:"rights",...LANGS,props:[ALTS]},{name:"date"},{name:"dcterms:modified",type:"meta"},{name:"subject",many:!0,...LANGS,props:["term","authority",ALTS]},{name:"belongs-to-collection",type:"meta",many:!0,...LANGS,props:["collection-type","group-position","dcterms:identifier","file-as",ALTS,{name:"belongs-to-collection",recursive:!0}]}],parseNav=(doc,resolve=f=>f)=>{const{$:$,$$:$$,$$$:$$$}=childGetter(doc,NS$1_XHTML),parseLI=getType=>$li=>{const $a=$($li,"a")??$($li,"span"),$ol=$($li,"ol"),href=(href=>href?decodeURI(resolve(href)):null)($a?.getAttribute("href")),result={label:getElementText$1($a)||$a?.getAttribute("title"),href:href,subitems:parseOL($ol)};return getType&&(result.type=$a?.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)),result},parseOL=($ol,getType)=>$ol?$$($ol,"li").map(parseLI(getType)):null,parseNav=($nav,getType)=>parseOL($($nav,"ol"),getType),$$nav=$$$(doc,"nav");let toc=null,pageList=null,landmarks=null,others=[];for(const $nav of $$nav){const type=$nav.getAttributeNS(NS$1_EPUB,"type")?.split(/\s/)??[];type.includes("toc")?toc??=parseNav($nav):type.includes("page-list")?pageList??=parseNav($nav):type.includes("landmarks")?landmarks??=parseNav($nav,!0):others.push({label:getElementText$1($nav.firstElementChild),type:type,list:parseNav($nav)})}return{toc:toc,pageList:pageList,landmarks:landmarks,others:others}},parseNCX=(doc,resolve=f=>f)=>{const{$:$,$$:$$}=childGetter(doc,NS$1_NCX),parseItem=el=>{const $label=$(el,"navLabel"),$content=$(el,"content"),label=getElementText$1($label),href=(href=>href?decodeURI(resolve(href)):null)($content.getAttribute("src"));if("navPoint"===el.localName){const els=$$(el,"navPoint");return{label:label,href:href,subitems:els.length?els.map(parseItem):null}}return{label:label,href:href}},parseList=(el,itemName)=>$$(el,itemName).map(parseItem),getSingle=(container,itemName)=>{const $container=$(doc.documentElement,container);return $container?parseList($container,itemName):null};return{toc:getSingle("navMap","navPoint"),pageList:getSingle("pageList","pageTarget"),others:$$(doc.documentElement,"navList").map(el=>({label:getElementText$1($(el,"navLabel")),list:parseList(el,"navTarget")}))}},parseClock=str=>{if(!str)return;const parts=str.split(":").map(x=>parseFloat(x));if(3===parts.length){const[h,m,s]=parts;return 60*h*60+60*m+s}if(2===parts.length){const[m,s]=parts;return 60*m+s}const[x,unit]=str.split(/(?=[^\d.])/);return parseFloat(x)*("h"===unit?3600:"min"===unit?60:"ms"===unit?.001:1)},isUUID=/([0-9a-f]{8})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{4})-([0-9a-f]{12})/,getIdentifier=opf=>getElementText$1(opf.getElementById(opf.documentElement.getAttribute("unique-identifier"))??opf.getElementsByTagNameNS(NS$1_DC,"identifier")[0]),deobfuscate=async(key,length,blob)=>{const array=new Uint8Array(await blob.slice(0,length).arrayBuffer());length=Math.min(length,array.length);for(var i=0;i{const data=(new TextEncoder).encode(str),buffer=await globalThis.crypto.subtle.digest("SHA-1",data);return new Uint8Array(buffer)},deobfuscators=(sha1=WebCryptoSHA1)=>({"http://www.idpf.org/2008/embedding":{key:opf=>sha1(getIdentifier(opf).replaceAll(/[\u0020\u0009\u000d\u000a]/g,"")),decode:(key,blob)=>deobfuscate(key,1040,blob)},"http://ns.adobe.com/pdf/enc#RC":{key:opf=>{const uuid=(opf=>{for(const el of opf.getElementsByTagNameNS(NS$1_DC,"identifier")){const[id]=getElementText$1(el).split(":").slice(-1);if(isUUID.test(id))return id}return""})(opf).replaceAll("-","");return Uint8Array.from({length:16},(_,i)=>parseInt(uuid.slice(2*i,2*i+2),16))},decode:(key,blob)=>deobfuscate(key,1024,blob)}});class Encryption{#uris=new Map;#decoders=new Map;#algorithms;constructor(algorithms){this.#algorithms=algorithms}async init(encryption,opf){if(!encryption)return;const data=Array.from(encryption.getElementsByTagNameNS(NS$1_ENC,"EncryptedData"),el=>({algorithm:el.getElementsByTagNameNS(NS$1_ENC,"EncryptionMethod")[0]?.getAttribute("Algorithm"),uri:el.getElementsByTagNameNS(NS$1_ENC,"CipherReference")[0]?.getAttribute("URI")}));for(const{algorithm:algorithm,uri:uri}of data){if(!this.#decoders.has(algorithm)){const algo=this.#algorithms[algorithm];if(!algo){console.warn("Unknown encryption algorithm");continue}const key=await algo.key(opf);this.#decoders.set(algorithm,blob=>algo.decode(key,blob))}this.#uris.set(uri,algorithm)}}getDecoder(uri){return this.#decoders.get(this.#uris.get(uri))??(x=>x)}}class Resources{constructor({opf:opf,resolveHref:resolveHref}){this.opf=opf;const{$:$,$$:$$,$$$:$$$}=childGetter(opf,NS$1_OPF),$manifest=$(opf.documentElement,"manifest"),$spine=$(opf.documentElement,"spine"),$$itemref=$$($spine,"itemref");this.manifest=$$($manifest,"item").map(getAttributes("href","id","media-type","properties","media-overlay")).map(item=>(item.href=resolveHref(item.href),item.properties=item.properties?.split(/\s/),item)),0===this.manifest.length&&(this.manifest=Array.from($manifest.children).map(item=>{const attrs=getAttributes("href","id","media-type","properties","media-overlay")(item);return attrs.href=resolveHref(attrs.href),attrs.properties=attrs.properties?.split(/\s/),attrs})),this.spine=$$itemref.map(getAttributes("idref","id","linear","properties")).map(item=>(item.properties=item.properties?.split(/\s/),item)),this.pageProgressionDirection=$spine.getAttribute("page-progression-direction"),this.navPath=this.getItemByProperty("nav")?.href,this.ncxPath=(this.getItemByID($spine.getAttribute("toc"))??this.manifest.find(item=>item.mediaType===MIME$2.NCX))?.href;const $guide=$(opf.documentElement,"guide");$guide&&(this.guide=$$($guide,"reference").map(getAttributes("type","title","href")).map(({type:type,title:title,href:href})=>({label:title,type:type.split(/\s/),href:resolveHref(href)}))),this.cover=this.getItemByProperty("cover-image")??this.getItemByID("cover-image")??this.getItemByID($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByHref($$$(opf,"meta").find(filterAttribute("name","cover"))?.getAttribute("content"))??this.getItemByID("cover.jpg")??this.getItemByID("cover.png")??this.getItemByID("cover.jpeg")??this.getItemByHref(this.guide?.find(ref=>ref.type.includes("cover")&&!ref.href.includes("html")&&!ref.href.includes("xhtml")&&!ref.href.includes("xml"))?.href)??this.getItemByID("cover"),this.cover&&this.cover.href&&(this.cover.href.includes("xml")||this.cover.href.includes("xhtml")||this.cover.href.includes("html"))&&(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.href.includes("png")||item.href.includes("jpg")||item.href.includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.href.toLowerCase().includes("cover")&&(item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg")))),this.cover||(this.cover=this.manifest.find(item=>item.mediaType?.startsWith("image/")||item.href.toLowerCase().includes("png")||item.href.toLowerCase().includes("jpg")||item.href.toLowerCase().includes("svg")||item.href.toLowerCase().includes("jpeg"))),this.cfis=(elements=>{const results=[],{parentNode:parentNode}=elements[0],parts=nodeToParts(parentNode);for(const[index,node]of indexChildNodes(parentNode).entries()){const el=elements[results.length];node===el&&results.push(toString([parts.concat({id:el.id,index:index})]))}return results})($$itemref)}getItemByID(id){return this.manifest.find(item=>item.id===id)}getItemByHref(href){return this.manifest.find(item=>item.href===href)}getItemByProperty(prop){return this.manifest.find(item=>item.properties?.includes(prop))}resolveCFI(cfi){const parts=parse(cfi),top=(parts.parent??parts).shift();let $itemref=toElement(this.opf,top);$itemref&&"idref"!==$itemref.nodeName&&(top.at(-1).id=null,$itemref=toElement(this.opf,top));const idref=$itemref?.getAttribute("idref");return{index:this.spine.findIndex(item=>item.idref===idref),anchor:doc=>((doc,parts)=>{const startParts=collapse(parts),endParts=collapse(parts,!0),root=doc.documentElement,start=partsToNode(root,startParts[0]),end=partsToNode(root,endParts[0]),range=doc.createRange();return start.before?range.setStartBefore(start.node):start.after?range.setStartAfter(start.node):range.setStart(start.node,start.offset),end.before?range.setEndBefore(end.node):end.after?range.setEndAfter(end.node):range.setEnd(end.node,end.offset),range})(doc,parts)}}}class Loader{#cache=new Map;#children=new Map;#refCount=new Map;allowScript=!1;constructor({loadText:loadText,loadBlob:loadBlob,resources:resources}){this.loadText=loadText,this.loadBlob=loadBlob,this.manifest=resources.manifest,this.assets=resources.manifest}createURL(href,data,type,parent){if(!data)return"";const url=URL.createObjectURL(new Blob([data],{type:type}));if(this.#cache.set(href,url),this.#refCount.set(href,1),parent){const childList=this.#children.get(parent);childList?childList.push(href):this.#children.set(parent,[href])}return url}ref(href,parent){const childList=this.#children.get(parent);return childList?.includes(href)||(this.#refCount.set(href,this.#refCount.get(href)+1),childList?childList.push(href):this.#children.set(parent,[href])),this.#cache.get(href)}unref(href){if(!this.#refCount.has(href))return;const count=this.#refCount.get(href)-1;if(count<1){URL.revokeObjectURL(this.#cache.get(href)),this.#cache.delete(href),this.#refCount.delete(href);const childList=this.#children.get(href);if(childList)for(;childList.length;)this.unref(childList.pop());this.#children.delete(href)}else this.#refCount.set(href,count)}async loadItem(item,parents=[]){if(!item)return null;const{href:href,mediaType:mediaType}=item,isScript=MIME$2.JS.test(item.mediaType);if(isScript&&!this.allowScript)return null;const parent=parents.at(-1);if(this.#cache.has(href))return this.ref(href,parent);return(isScript||[MIME$2.XHTML,MIME$2.HTML,MIME$2.CSS,MIME$2.SVG].includes(mediaType))&&parents.every(p=>p!==href)?this.loadReplaced(item,parents):this.createURL(href,await this.loadBlob(href),mediaType,parent)}async loadHref(href,base,parents=[]){if(isExternal(href))return href;const path=resolveURL(href,base);let item=this.manifest.find(item=>item.href===path);return item||(item={href:path,mediaType:""}),this.loadItem(item,parents.concat(base))}async loadReplaced(item,parents=[]){const{href:href,mediaType:mediaType}=item,parent=parents.at(-1),str=await this.loadText(href);if(!str)return null;if([MIME$2.XHTML,MIME$2.HTML,MIME$2.SVG].includes(mediaType)){let doc=(new DOMParser).parseFromString(str.trim(),mediaType);if(mediaType===MIME$2.XHTML&&doc.querySelector("parsererror")&&(console.warn(doc.querySelector("parsererror").innerText),item.mediaType=MIME$2.HTML,doc=(new DOMParser).parseFromString(str.trim(),item.mediaType)),[MIME$2.XHTML,MIME$2.SVG].includes(item.mediaType)){let child=doc.firstChild;for(;child instanceof ProcessingInstruction;){if(child.data){const replacedData=await replaceSeries$1(child.data,/(?:^|\s*)(href\s*=\s*['"])([^'"]*)(['"])/i,(_,p1,p2,p3)=>this.loadHref(p2,href,parents).then(p2=>`${p1}${p2}${p3}`));child.replaceWith(doc.createProcessingInstruction(child.target,replacedData))}child=child.nextSibling}}const replace=async(el,attr)=>el.setAttribute(attr,await this.loadHref(el.getAttribute(attr),href,parents));for(const el of doc.querySelectorAll("link[href]"))await replace(el,"href");for(const el of doc.querySelectorAll("[src]"))await replace(el,"src");for(const el of doc.querySelectorAll("[poster]"))await replace(el,"poster");for(const el of doc.querySelectorAll("object[data]"))await replace(el,"data");for(const el of doc.querySelectorAll("[*|href]:not([href]"))el.setAttributeNS(NS$1_XLINK,"href",await this.loadHref(el.getAttributeNS(NS$1_XLINK,"href"),href,parents));for(const el of doc.querySelectorAll("style"))el.textContent&&(el.textContent=await this.replaceCSS(el.textContent,href,parents));for(const el of doc.querySelectorAll("[style]"))el.setAttribute("style",await this.replaceCSS(el.getAttribute("style"),href,parents));const result=(new XMLSerializer).serializeToString(doc);return this.createURL(href,result,item.mediaType,parent)}const result=mediaType===MIME$2.CSS?await this.replaceCSS(str,href,parents):await this.replaceString(str,href,parents);return this.createURL(href,result,mediaType,parent)}async replaceCSS(str,href,parents=[]){const replacedUrls=await replaceSeries$1(str,/url\(\s*["']?([^'"\n]*?)\s*["']?\s*\)/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`url("${url}")`)),replacedImports=await replaceSeries$1(replacedUrls,/@import\s*["']([^"'\n]*?)["']/gi,(_,url)=>this.loadHref(url,href,parents).then(url=>`@import "${url}"`)),w=window?.innerWidth??800,h=window?.innerHeight??600;return replacedImports.replace(/-epub-/gi,"").replace(/(\d*\.?\d+)vw/gi,(_,d)=>parseFloat(d)*w/100+"px").replace(/(\d*\.?\d+)vh/gi,(_,d)=>parseFloat(d)*h/100+"px").replace(/page-break-(after|before|inside)/gi,(_,x)=>`-webkit-column-break-${x}`)}replaceString(str,href,parents=[]){const assetMap=new Map,urls=this.assets.map(asset=>{if(asset.href===href)return;const relative=((from,to)=>{if(!from)return to;const as=from.replace(/\/$/,"").split("/"),bs=to.replace(/\/$/,"").split("/"),i=(as.length>bs.length?as:bs).findIndex((_,i)=>as[i]!==bs[i]);return i<0?"":Array(as.length-i).fill("..").concat(bs.slice(i)).join("/")})((str=>str.slice(0,str.lastIndexOf("/")+1))(href),asset.href),relativeEnc=encodeURI(relative),rootRelative="/"+asset.href,rootRelativeEnc=encodeURI(rootRelative),set=new Set([relative,relativeEnc,rootRelative,rootRelativeEnc]);for(const url of set)assetMap.set(url,asset);return Array.from(set)}).flat().filter(x=>x);if(!urls.length)return str;const regex=new RegExp(urls.map(regexEscape).join("|"),"g");return replaceSeries$1(str,regex,async match=>this.loadItem(assetMap.get(match.replace(/^\//,"")),parents.concat(href)))}unloadItem(item){this.unref(item?.href)}}const getPageSpread$1=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class EPUB{parser=new DOMParser;#encryption;constructor({loadText:loadText,loadBlob:loadBlob,getSize:getSize,sha1:sha1}){this.loadText=loadText,this.loadBlob=loadBlob,this.getSize=getSize,this.#encryption=new Encryption(deobfuscators(sha1))}#parseXML(str){return str&&str.includes("opf:scheme")&&(str=str.replaceAll("opf:scheme","scheme")),str&&(str=str.replace(/^\uFEFF/,"").replace(//g,(match,content)=>`\x3c!--${content.replace(/--/g,"- -")}--\x3e`).replace(/&(?!(?:amp|lt|gt|quot|apos|#\d+|#x[\da-fA-F]+);)/g,"&").replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g,"")),str?this.parser.parseFromString(str.trim(),MIME$2.XML):null}async#loadXML(uri){return this.#parseXML(await this.loadText(uri))}async init(){const $container=await this.#loadXML("META-INF/container.xml");if(!$container)throw new Error("Failed to load container file");const opfs=Array.from($container.getElementsByTagNameNS(NS$1_CONTAINER,"rootfile"),getAttributes("full-path","media-type")).filter(file=>"application/oebps-package+xml"===file.mediaType);if(!opfs.length)throw new Error("No package document defined in container");const opfPath=opfs[0].fullPath,opf=await this.#loadXML(opfPath);if(!opf)throw new Error("Failed to load package document");if(opf.querySelector("parsererror"))throw new Error("Package document is not a valid XML");const $encryption=await this.#loadXML("META-INF/encryption.xml");await this.#encryption.init($encryption,opf),this.resources=new Resources({opf:opf,resolveHref:url=>resolveURL(url,opfPath)});const loader=new Loader({loadText:this.loadText,loadBlob:uri=>Promise.resolve(this.loadBlob(uri)).then(this.#encryption.getDecoder(uri)),resources:this.resources});this.sections=this.resources.spine.map((spineItem,index)=>{const{idref:idref,linear:linear,properties:properties=[]}=spineItem,item=this.resources.getItemByID(idref);return item?{id:this.resources.getItemByID(idref)?.href,load:()=>loader.loadItem(item),unload:()=>loader.unloadItem(item),createDocument:()=>this.loadDocument(item),size:this.getSize(item.href),cfi:this.resources.cfis[index],linear:linear,pageSpread:getPageSpread$1(properties),resolveHref:href=>resolveURL(href,item.href),loadMediaOverlay:()=>this.loadMediaOverlay(item)}:(console.warn(`Could not find item with ID "${idref}" in manifest`),null)});const{navPath:navPath,ncxPath:ncxPath}=this.resources;if(navPath)try{const resolve=url=>resolveURL(url,navPath),nav=parseNav(await this.#loadXML(navPath),resolve);this.toc=nav.toc,this.pageList=nav.pageList,this.landmarks=nav.landmarks}catch(e){console.warn(e)}if((!this.toc||0===this.toc.length)&&ncxPath)try{const resolve=url=>resolveURL(url,ncxPath),ncx=parseNCX(await this.#loadXML(ncxPath),resolve);this.toc=ncx.toc,this.pageList=ncx.pageList}catch(e){console.warn(e)}this.landmarks??=this.resources.guide;const{metadata:metadata,rendition:rendition,media:media}=(opf=>{const{$:$,$$:$$}=childGetter(opf,NS$1_OPF),$metadata=$(opf.documentElement,"metadata"),els=Array.from($metadata.children),getValue=(obj,el)=>{if(!el)return null;const{props:props=[],attrs:attrs=[]}=obj,value=getElementText$1(el);if(!props.length&&!attrs.length)return value;const id=el.getAttribute("id"),refines=id?els.filter(filterAttribute("refines","#"+id)):[];return Object.fromEntries([["value",value]].concat(props.map(prop=>{const{many:many,recursive:recursive}=prop,name="string"==typeof prop?prop:prop.name,filter=filterAttribute("property",name),subobj=recursive?obj:prop;return[camel(name),many?refines.filter(filter).map(el=>getValue(subobj,el)):getValue(subobj,refines.find(filter))]})).concat(attrs.map(attr=>[camel(attr),el.getAttribute(attr)])))},arr=els.filter(filterAttribute("refines",null)),getProperties=prefix=>Object.fromEntries($$($metadata,"meta").filter(filterAttribute("property",x=>x?.startsWith(prefix))).map(el=>[el.getAttribute("property").replace(prefix,""),getElementText$1(el)]));return{metadata:Object.fromEntries(METADATA.map(obj=>{const{type:type,name:name,many:many}=obj,filter="meta"===type?el=>el.namespaceURI===NS$1_OPF&&el.getAttribute("property")===name:el=>el.namespaceURI===NS$1_DC&&el.localName===name;return[camel(name),many?arr.filter(filter).map(el=>getValue(obj,el)):getValue(obj,arr.find(filter))]})),rendition:getProperties("rendition:"),media:getProperties("media:")}})(opf);this.rendition=rendition,this.media=media,media.duration=parseClock(media.duration),this.dir=this.resources.pageProgressionDirection,this.rawMetadata=metadata;const title=metadata?.title?.[0];this.metadata={title:title?.value,sortAs:title?.fileAs,language:metadata?.language,identifier:getIdentifier(opf),description:metadata?.description?.value,publisher:metadata?.publisher?.value,published:metadata?.date,modified:metadata?.dctermsModified,subject:metadata?.subject?.filter(({value:value,code:code})=>value||code)?.map(({value:value,code:code,scheme:scheme})=>({name:value,code:code,scheme:scheme})),rights:metadata?.rights?.value};const relators={art:"artist",aut:"author",bkp:"producer",clr:"colorist",edt:"editor",ill:"illustrator",trl:"translator",pbl:"publisher"},mapContributor=defaultKey=>obj=>{const keys=[...new Set(obj.role?.map(({value:value,scheme:scheme})=>(scheme&&"marc:relators"!==scheme?null:relators[value])??defaultKey))],value={name:obj.value,sortAs:obj.fileAs};return[keys?.length?keys:[defaultKey],value]};return metadata?.creator?.map(mapContributor("author"))?.concat(metadata?.contributor?.map?.(mapContributor("contributor")))?.forEach(([keys,value])=>keys.forEach(key=>{this.metadata[key]?this.metadata[key].push(value):this.metadata[key]=[value]})),this}async loadDocument(item){const str=await this.loadText(item.href);return this.parser.parseFromString(str.trim(),item.mediaType)}async loadMediaOverlay(item){const id=item.mediaOverlay;if(!id)return null;const media=this.resources.getItemByID(id),parsed=((doc,resolve=f=>f)=>{const{$:$,$$$:$$$}=childGetter(doc,NS$1_SMIL);return $$$(doc,"par").map($par=>{const id=$($par,"text")?.getAttribute("src")?.split("#")?.[1],$audio=$($par,"audio");return $audio?{id:id,audio:{src:(href=$audio.getAttribute("src"),href?decodeURI(resolve(href)):null),clipBegin:parseClock($audio.getAttribute("clipBegin")),clipEnd:parseClock($audio.getAttribute("clipEnd"))}}:{id:id};var href})})(await this.#loadXML(media.href),url=>resolveURL(url,media.href));return parsed}resolveCFI(cfi){return this.resources.resolveCFI(cfi)}resolveHref(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id),anchor:hash?doc=>((doc,id)=>doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`))(doc,hash):()=>0}}resolveHrefIndex(href){const[path,hash]=href.split("#"),item=this.resources.getItemByHref(decodeURI(path));if(!item)return null;return{index:this.resources.spine.findIndex(({idref:idref})=>idref===item.id)}}splitTOCHref(href){return href?.split("#")??[]}getTOCFragment(doc,id){return doc.getElementById(id)??doc.querySelector(`[name="${CSS.escape(id)}"]`)}isExternal(uri){return isExternal(uri)}async getCover(){const cover=this.resources?.cover,coverBlob=cover?.href?await this.loadBlob(cover.href):null;return cover?.href&&coverBlob&&coverBlob.size>0?new Blob([coverBlob],{type:cover.mediaType}):null}async getCalibreBookmarks(){const txt=await this.loadText("META-INF/calibre_bookmarks.txt"),magic="encoding=json+base64:";if(txt?.startsWith(magic)){const json=atob(txt.slice(21));return JSON.parse(json)}}}let keywords=["章","节","回","節","卷","部","輯","辑","話","集","话","篇"," "," "],containChars=[],startWithChars=["CHAPTER","Chapter","序章","前言","声明","写在前面的话","后记","楔子","后序","章节目录","尾声","聲明","寫在前面的話","後記","後序","章節目錄","尾聲"];const txtToHtml=(text,parserRegex,bookLocation)=>{let lines=text.split("\n");1===lines.length&&(lines=text.split("\r"));const htmlParts=[];let isRefresh=!1,noTitle=!1;if(bookLocation&&bookLocation.refresh&&(isRefresh=!0),bookLocation&&bookLocation.noTitle&&(noTitle=!0),noTitle){let chapterIndex=0;for(let i=0;iChapter ${chapterIndex}`),chapterLines.forEach(line=>{""===line.trim()?htmlParts.push(`

${line}

`):htmlParts.push(`

${line}

`)}),chapterIndex++}}else if(lines.length>1e4&&!isRefresh){bookLocation&&bookLocation.chapterTitle||(bookLocation={text:lines[0],chapterTitle:"",chapterDocIndex:0}),bookLocation.text||(bookLocation.text=bookLocation.chapterTitle||"");let targetLineIndex=lines.findIndex(item=>cleanText(item)===cleanText(bookLocation.text));-1===targetLineIndex&&(targetLineIndex=0);const startIndex=Math.max(targetLineIndex-3e3,0),endIndex=Math.min(targetLineIndex+3e3,lines.length),relevantLines=lines.slice(startIndex,endIndex),titlesInSlice=relevantLines.filter(item=>item&&isTitle(item,parserRegex));if(titlesInSlice.length<=1)return txtToHtml(text,parserRegex,{noTitle:!0});const cleanedTitlesSet=new Set(titlesInSlice.map(title=>cleanText(title)));let targetTitleIndex=((arr,callback)=>{for(let i=arr.length-1;i>=0;i--)if(callback(arr[i]))return i;return-1})(titlesInSlice,item=>cleanText(item)===cleanText(bookLocation.chapterTitle));if(-1===targetTitleIndex&&(targetTitleIndex=0),targetTitleIndex0)for(let i=0;iPrepend ${i}`),htmlParts.push(`

Text ${i}

`)}for(const item of relevantLines){const cleanedItem=cleanText(item);if(cleanedItem&&cleanedTitlesSet.has(cleanedItem))htmlParts.push(`

${cleanedItem}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}}}else for(const item of lines)if(item&&isTitle(item,parserRegex))htmlParts.push(`

${item}

`);else{if(""===item.trim()){htmlParts.push(`

${item}

`);continue}htmlParts.push(`

${item}

`)}const finalHtml=htmlParts.join("");return finalHtml&&finalHtml.includes("str.trim().replace(/(\r\n|\n|\r|\t)/gm,"").substring(0,100).split("").filter(item=>"="!==item&&"-"!==item&&"_"!==item&&"+"!==item).join(""),isTitle=(line,parserRegex="")=>parserRegex?new RegExp(parserRegex).test(line):(line=cleanText(line))&&line.length<50&&!isContain(line)&&(isStartWithChars(line)||line.startsWith("第")&&startWithDI(line)||line.startsWith("卷")&&startWithJUAN(line)||line.indexOf("第")>-1&&line.lastIndexOf("第")<7&&startWithDI(line.substr(line.indexOf("第")))),isContain=line=>containChars.filter(item=>line.indexOf(item)>-1).length>0,isStartWithChars=line=>startWithChars.filter(item=>line.startsWith(item)).length>0,startWithDI=line=>{let flag=!1;for(let i=0;i{let regExp=/^[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d\u5341\u767e\u5343\u4e07\u842c\u96f6]+$/;return!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf(" ")))&&!/^\d+$/.test(line.substring(1,line.indexOf(" "))))||(!(!regExp.test(line.substring(1,line.indexOf("·")))&&!/^\d+$/.test(line.substring(1,line.indexOf("·"))))||!(!regExp.test(line.substring(1))&&!/^\d+$/.test(line.substring(1)))))};let lock=!1;const playMimicalFlip=(animation,isMobile,delta,flipToNextPage,flipToPrevPage)=>{if("mimical"!==animation||"yes"===isMobile)return!1;const bookDiv=document.getElementById("book");return!!bookDiv&&(bookDiv.style.display="block",delta>0?flipToPrevPage():delta<0&&flipToNextPage(),setTimeout(()=>{bookDiv.style.display="none"},1e3),!0)},handleScrollPage=(element,animation,delta,doc,flipToNextPage,flipToPrevPage,isMobile)=>__awaiter(void 0,void 0,void 0,function*(){const vertical=isVerticalLayout();if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;const height=element.clientHeight,currentScrollTop=doc.body.scrollTop,scrollDistance=height+gap;if(delta>0){const currentPage=Math.round(currentScrollTop/scrollDistance),targetScrollTop=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollTop=(Math.round(currentScrollTop/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const width=element.clientWidth,currentScrollLeft=doc.body.scrollLeft,scrollDistance=width+gap;if(delta>0){const currentPage=Math.round(currentScrollLeft/scrollDistance),targetScrollLeft=Math.max(0,currentPage-1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}else if(delta<0){const targetScrollLeft=(Math.round(currentScrollLeft/scrollDistance)+1)*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===animation&&"yes"!==isMobile?"smooth":"auto"})}}}),findValidChapter=(chapterDocIndex,chapterHref,chapterDocList,flag)=>{let currentChapterIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref));return chapterHref&&_.findLastIndex(chapterDocList,chapter=>chapter.href===chapterHref||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(chapterHref))>-1||(currentChapterIndex=chapterDocIndex),"prev"===flag?Object.assign(Object.assign({},chapterDocList[currentChapterIndex-1]),{index:currentChapterIndex-1}):Object.assign(Object.assign({},chapterDocList[currentChapterIndex+1]),{index:currentChapterIndex+1})},handlePrevChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(0===chapterDocIndex)return;let prevChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"prev");prevChapter&&(tempLocation.text="prevChapter",tempLocation.page="",yield handleRenderChapter(prevChapter.index,prevChapter.label,prevChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),isElementFootnote=element=>{if(!element)return!1;if("IMG"===element.tagName)return!0;if(element.textContent){let textContent=element.textContent.trim();return isContentFootnote(textContent)}return!1},isContentFootnote=content=>{if(!content)return!1;let textContent=content.trim();return!!/^(\[|\(|〔|【|〈|《|〚)([a-zA-Z0-9零一二三四五六七八九十百千万]+)(\]|\)|〕|】|〉|》|〛)$|^\d+$|^(M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX|IV|V?I{0,3}))$|^[①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳㉑㉒㉓㉔㉕㉖㉗㉘㉙㉚㉛㉜㉝㉞㉟㊱㊲㊳㊴㊵㊶㊷㊸㊹㊺㊻㊼㊽㊾㊿]$/i.test(textContent)||(textContent.toLowerCase().indexOf("footnote")>-1||textContent.toLowerCase().indexOf("脚注")>-1||textContent.toLowerCase().indexOf("注释")>-1||textContent.toLowerCase().indexOf("注")>-1||textContent.toLowerCase().indexOf("fn")>-1||("*"===textContent||"†"===textContent||"‡"===textContent||"※"===textContent||"§"===textContent))},convertBlobToDataURL=blobUrl=>__awaiter(void 0,void 0,void 0,function*(){const response=yield fetch(blobUrl),blob=yield response.blob();return new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}),handleRenderChapter=(chapterDocIndex,chapterTitle,chapterHref,chapterDocList,element,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){if(doc.body.innerHTML="",iframe.height="0px",doc.body.scrollTo(0,0),chapterTitle&&!chapterDocIndex||chapterDocList[chapterDocIndex]&&chapterDocList[chapterDocIndex].label&&chapterTitle&&chapterTitle!==chapterDocList[chapterDocIndex].label&&-1===chapterHref.indexOf("#")){let tempChapterDocIndex=_.findLastIndex(chapterDocList,{label:chapterTitle});-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}if(-1===chapterDocIndex&&chapterHref.indexOf("#")>-1){let href=chapterHref.split("#")[0],tempChapterDocIndex=_.findLastIndex(chapterDocList,chapter=>chapter.href===href||chapter.href&&chapter.href.includes("#")&&chapter.href.includes(href));-1!==tempChapterDocIndex&&(chapterDocIndex=tempChapterDocIndex)}(-1===chapterDocIndex||chapterDocIndex>chapterDocList.length-1)&&(chapterDocIndex=0);let chapterText=yield handleOneChapterDoc(chapterDocList[chapterDocIndex].text,!1),bodyAttrs=function(htmlStr){const bodyTagMatch=htmlStr.match(/]*)>/i);if(!bodyTagMatch)return{};const attrStr=bodyTagMatch[1],attributes={},attrRegex=/([\w-]+)\s*=\s*(?:"([^"]*)"|'([^']*)'|([^>\s]+))/g;let match;for(;null!==(match=attrRegex.exec(attrStr));){const value=match[2]||match[3]||match[4]||"";attributes[match[1]]=value}return attributes}(chapterText);const viewport=function(htmlStr){if(!htmlStr)return null;const metaMatch=htmlStr.match(/]*name\s*=\s*["']viewport["'][^>]*content\s*=\s*["']([^"']+)["'][^>]*>/i);if(!metaMatch)return null;const content=metaMatch[1]||"",widthMatch=content.match(/\bwidth\s*=\s*(\d+(?:\.\d+)?)\b/i),heightMatch=content.match(/\bheight\s*=\s*(\d+(?:\.\d+)?)\b/i),width=widthMatch?parseFloat(widthMatch[1]):void 0,height=heightMatch?parseFloat(heightMatch[1]):void 0;return width||height?{width:width,height:height}:null}(chapterText);doc.body.innerHTML=chapterText,bodyAttrs.class?doc.body.setAttribute("class",bodyAttrs.class):doc.body.removeAttribute("class"),bodyAttrs.id?doc.body.setAttribute("id",bodyAttrs.id):doc.body.removeAttribute("id");let baseStyle=doc.body.getAttribute("style")||"";baseStyle&&(baseStyle=baseStyle.split(";").map(s=>s.trim()).filter(s=>s&&!/^transform(-origin)?\s*:/i.test(s)).join("; "),baseStyle&&(baseStyle+=";"));const incomingStyle=bodyAttrs.style||"",mergedStyle=mergeStyleStrings(baseStyle,incomingStyle),chapterFixedWidth=(null==viewport?void 0:viewport.width)||getStylePxNumber(incomingStyle,"width"),chapterFixedHeight=(null==viewport?void 0:viewport.height)||getStylePxNumber(incomingStyle,"height");if(chapterFixedWidth&&chapterFixedHeight){const pageWidth=function(element,readerMode){if(!element)return 0;const section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,scale="double"===readerMode?2:1;return(element.clientWidth-gap)/scale}(element,readerMode),iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height,availableHeight=iframeHeight>0?iframeHeight:element.clientHeight;if(pageWidth>0&&availableHeight>0&&getStylePxNumber(mergedStyle,"width")&&getStylePxNumber(mergedStyle,"width")!==element.clientWidth){const widthRatio=pageWidth/chapterFixedWidth,heightRatio=availableHeight/chapterFixedHeight,scaledStyle=mergeStyleStrings(mergedStyle,`transform: scale(${Math.min(1,widthRatio,heightRatio)}); transform-origin: left top;`);doc.body.setAttribute("style",scaledStyle),doc.body.setAttribute("data-kookit-fixed-scale","true")}else doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")}else mergedStyle?(doc.body.setAttribute("style",mergedStyle),doc.body.removeAttribute("data-kookit-fixed-scale")):(doc.body.removeAttribute("style"),doc.body.removeAttribute("data-kookit-fixed-scale"));if(yield handleCssLink(doc),yield handlePlainText(doc),!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(chapterDocList[tempChapterDocIndex].label){chapterTitle=chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}tempLocation.chapterTitle=chapterTitle,tempLocation.chapterHref=chapterHref,tempLocation.chapterDocIndex=chapterDocIndex+"",tempLocation.percentage=chapterDocList.slice(0,chapterDocIndex).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)+"",tempLocation.text="",tempLocation.xpath=`/body/DocFragment[${chapterDocIndex+1}]`,tempLocation.timestamp=parseInt((new Date).getTime()/1e3+""),yield((element,readerMode,format,iframe,doc)=>__awaiter(void 0,void 0,void 0,function*(){if(yield Promise.race([Promise.all(Array.from([...doc.images,...doc.querySelectorAll("image")]).map(img=>img.complete?Promise.resolve(0!==img.naturalHeight):new Promise(resolve=>{img.addEventListener("load",()=>resolve(!0)),img.addEventListener("error",()=>resolve(!1))}))),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("image load timeout")},10)})]),doc.body.getAttribute("data-kookit-fixed-scale")||(yield handleImageSize(element,readerMode,format,doc)),yield handleTextStyle(doc),"scroll"!==readerMode){if(iframe.height=element.clientHeight+"px","double"===readerMode)if(isVerticalLayout());else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,pageWidth=(element.clientWidth+gap)/2;if((doc.body.scrollWidth-doc.body.clientWidth)/pageWidth%2==1){let tailElem=document.createElement("div");tailElem.setAttribute("style","height: "+doc.body.clientHeight+"px; display: inline-block; width: "+(pageWidth-gap)+"px"),doc.body.appendChild(tailElem)}}}else iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"}))(element,readerMode,format,iframe,doc),yield handleScrollPosition(element,readerMode,"","","","",doc)});const handleCssLink=doc=>__awaiter(void 0,void 0,void 0,function*(){let linkList=Array.from(doc.getElementsByTagName("link"));if(0===linkList.length)return;let styleSheetPromises=[];for(let index=0;index{link.addEventListener("load",resolve)}))}try{yield Promise.race([Promise.all(styleSheetPromises),new Promise((resolve,reject)=>{setTimeout(()=>{resolve("css load timeout")},10)})])}catch(err){console.error(err)}}),handlePlainText=doc=>__awaiter(void 0,void 0,void 0,function*(){var _a;let childNodes=Array.from(doc.body.childNodes);for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let left=0,top=0,targetNode=doc.body;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(page&&"scroll"!==readerMode)if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;top=(element.clientHeight+gap)*(parseInt(page)-1)}else{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;left=((value=getComputedStyle(element).width,parseFloat(value.substring(0,value.length-2)))+gap)*(parseInt(page)-1)}else if(text){let targetNodeList=getBlockElement(doc.body).filter((s,index)=>cleanText(s.textContent)&&(cleanText(s.textContent).includes(cleanText(text))||cleanText(s.textContent).includes(Chinese_t2s(cleanText(text)))||cleanText(s.textContent).includes(Chinese_s2t(cleanText(text))))&&(Math.abs(index-parseInt(count))<("both"===window.fullTranslationMode||"target"===window.fullTranslationMode?1:2)||"search"===count||"ignore"===count||"next"===count));if(0===targetNodeList.length)return;targetNode=getCloestBlock(targetNodeList[0],element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):"prevChapter"===text?doc.body.scrollHeight:0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):"prevChapter"===text?doc.body.scrollWidth:0}else if(href&&href.indexOf("#")>-1){let id=CSS.escape(href.split("#").reverse()[0]);if(!doc.body.querySelector("#"+CSS.escape(id)))return;targetNode=getCloestBlock(doc.body.querySelector("#"+CSS.escape(id))||doc.body,element,readerMode),vertical?top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0:left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0}var value;"scroll"!==readerMode?vertical?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):targetNode.scrollIntoView()}),getCloestBlock=(targetNode,element,readerMode)=>{const vertical=isVerticalLayout()&&"scroll"!==readerMode;if("scroll"===readerMode)return targetNode;if(vertical){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1,offsetTop=getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop));return checkDivisibleInRange(parseInt(offsetTop+""),(element.clientHeight+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1,offsetLeft=getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft));return checkDivisibleInRange(parseInt(offsetLeft+""),(element.clientWidth+gap)/2)?targetNode:targetNode.parentElement?getCloestBlock(targetNode.parentElement,element,readerMode):targetNode}},checkDivisibleInRange=(x,y)=>{for(let i=x-10;i<=x+10;i++)if(i%y===0)return!0;return!1},handleRecord=(element,readerMode,flattenChapters,chapterDocList,tempLocation,doc,targetNode)=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;if(lock)return;let nodeList=getBlockElement(doc.body),visibleNode=nodeList.filter(s=>isScrolledIntoView(element,s,readerMode)&&(s.textContent||"").trim()),firstVisibleNode=visibleNode[0];targetNode&&(firstVisibleNode=targetNode);let count=0;for(let i=0;i{if(!node||!doc||!doc.body)return"";const parts=[];let current=node;for(;current&¤t!==doc.body&¤t!==doc;){const parent=current.parentNode;if(!parent)break;if(current.nodeType===Node.TEXT_NODE){current=parent;continue}const el=current,tag=el.tagName.toLowerCase(),siblings=Array.from(parent.childNodes).filter(n=>n.nodeType===Node.ELEMENT_NODE&&n.tagName.toLowerCase()===tag),index=siblings.indexOf(el)+1;parts.unshift(siblings.length>1?`${tag}[${index}]`:tag),current=parent}return"/body/"+parts.join("/")})(firstVisibleNode,doc),tempLocation.timestamp=parseInt((new Date).getTime()/1e3+"");let totalSize=chapterDocList.map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0);tempLocation.percentage=chapterDocList.slice(0,parseInt(tempLocation.chapterDocIndex)).map(item=>item.text&&item.text.size||1).reduce((a,b)=>a+b,0)/totalSize+((null===(_b=chapterDocList.find((_item,index)=>index===parseInt(tempLocation.chapterDocIndex)))||void 0===_b?void 0:_b.text.size)||0)/totalSize*(count/nodeList.length)+""}else tempLocation.page=(null===(_c=yield progressInfo(readerMode,doc,element))||void 0===_c?void 0:_c.currentPage)+"";lock=!0,setTimeout(()=>{lock=!1},100)}),isCurrentNodeFarFromParrent=(targetNode,element,readerMode)=>{if(isVerticalLayout()&&"scroll"!==readerMode){let section=Math.floor(element.clientHeight/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetTop(targetNode)-getActualOffsetTop(getCloestBlock(targetNode,element,readerMode)))>(element.clientHeight+gap)/2}{let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;return Math.abs(getActualOffsetLeft(targetNode)-getActualOffsetLeft(getCloestBlock(targetNode,element,readerMode)))>(element.clientWidth+gap)/2}},handleHashChapter=(visibleNode,flattenChapters,tempLocation)=>{let chapterHref=tempLocation.chapterHref||"",lastIndexOfHash=chapterHref.lastIndexOf("#"),beforeHash="";beforeHash=-1===lastIndexOfHash?chapterHref:chapterHref.substring(0,lastIndexOfHash);for(let index=0;index-1&&(tempLocation.chapterHref=newHref,tempLocation.chapterTitle=flattenChapters[newIndex].label)}}},handleNextChapter=(element,flattenChapters,chapterDocList,readerMode,format,tempLocation,doc,iframe)=>__awaiter(void 0,void 0,void 0,function*(){let chapterDocIndex=parseInt(tempLocation.chapterDocIndex||"0"),chapterHref=tempLocation.chapterHref||"";if(chapterDocIndex>=chapterDocList.length-1)return void(tempLocation.percentage="1");let nextChapter=findValidChapter(chapterDocIndex,chapterHref,chapterDocList,"next");nextChapter&&(tempLocation.page="",yield handleRenderChapter(nextChapter.index,nextChapter.label,nextChapter.href,chapterDocList,element,readerMode,format,tempLocation,doc,iframe))}),getAudioText=(element,readerMode,doc,isBackground)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),audioText=nodeList.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}).filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>item.textContent);if(isBackground)return audioText.filter(s=>s);let firstSliceIndex=0,visibleText=getVisibleText(element,readerMode,doc);if(visibleText&&visibleText.length>0){let trimmedVisibleText=visibleText.map(s=>s.trim());firstSliceIndex=audioText.findIndex(item=>item&&trimmedVisibleText.includes(item.trim()))}return-1===firstSliceIndex&&(firstSliceIndex=0),audioText.slice(firstSliceIndex).filter(s=>s)},ZERO_WIDTH_QUOTE_CHARS=/["'\u201d\u2019」』]/,snapRangeToSentences=(text,start,end)=>{const sentences=((text,lang)=>{if(void 0===Intl.Segmenter)return[{start:0,end:text.length}];const segments=new Intl.Segmenter(lang,{granularity:"sentence"}).segment(text);return Array.from(segments).map(s=>({start:s.index,end:s.index+s.segment.length})).filter(sentence=>""!==text.slice(sentence.start,sentence.end).trim())})(text,detectLocalLanguage(text));if(0===sentences.length)return{start:start,end:end};const overlapping=sentences.filter(s=>s.end>start&&s.start{if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.width>0&&rect.height>0&&rect.bottom>scrollTop&&rect.top0&&rect.left0&&rect.height>0&&rect.bottom>0&&rect.top0&&rect.left{const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;const rect=el.getBoundingClientRect();return isTextVisibleInViewport(rect,element,readerMode)},detectLocalLanguage=text=>{const chineseCount=(text.match(/[\u4e00-\u9fff\u3000-\u303f\uf900-\ufaff]/g)||[]).length,japaneseCount=(text.match(/[\u3040-\u309f\u30a0-\u30ff]/g)||[]).length,koreanCount=(text.match(/[\uac00-\ud7af\u1100-\u11ff]/g)||[]).length;return(chineseCount+japaneseCount+koreanCount)/text.length<=.3?"en":chineseCount>=japaneseCount&&chineseCount>=koreanCount?"zh":japaneseCount>=chineseCount&&japaneseCount>=koreanCount?"ja":"ko"},getNodeVisibleText=(element,item,readerMode)=>{const text=item.textContent||"";if(!text.trim())return text;if(!((element,el,readerMode)=>{if(!isNodeVisibleInViewport(element,el,readerMode))return!1;const rect=el.getBoundingClientRect();if("scroll"===readerMode){const scrollTop=element.scrollTop;return rect.topscrollTop+element.clientHeight||rect.right>element.clientWidth}return rect.top<0||rect.left<0||rect.bottom>element.clientHeight||rect.right>element.clientWidth})(element,item,readerMode))return text;const visibleRange=((element,root,readerMode)=>{const text=root.textContent||"";if(!text.trim())return null;const walker=document.createTreeWalker(root,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode(),offset=0,start=-1,end=-1;for(;currentNode;){const content=currentNode.textContent||"";if(content.length>0){const nodeRange=document.createRange();if(nodeRange.selectNodeContents(currentNode),Array.from(nodeRange.getClientRects()).some(rect=>isTextVisibleInViewport(rect,element,readerMode))){let prevCharVisible=!1;for(let i=0;iisTextVisibleInViewport(rect,element,readerMode));!visible&&prevCharVisible&&ZERO_WIDTH_QUOTE_CHARS.test(content[i])&&(visible=!0),visible&&(-1===start&&(start=offset+i),end=offset+i+1),prevCharVisible=visible}}}offset+=content.length,currentNode=walker.nextNode()}return-1===start||-1===end?null:{start:start,end:end,text:text}})(element,item,readerMode);if(!visibleRange)return text;const{start:start,end:end}=snapRangeToSentences(text,visibleRange.start,visibleRange.end);return end<=start?text.substring(visibleRange.start,visibleRange.end):text.substring(start,end)},getVisibleText=(element,readerMode,doc)=>{let nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item)),visibleNode=nodeList.filter(s=>isNodeVisibleInViewport(element,s,readerMode)&&(s.textContent||"").trim());return visibleNode=visibleNode.filter(s=>{if(!(s.textContent||"").trim())return!1;let parent=s.parentElement;for(;parent&&parent!==doc.body;){if(nodeList.includes(parent))return!1;parent=parent.parentElement}return!0}),visibleNode.filter(item=>{var _a;return"img"!==item.textContent&&!(null===(_a=item.textContent)||void 0===_a?void 0:_a.startsWith("img"))}).map(item=>getNodeVisibleText(element,item,readerMode)).filter(s=>s)},handleHighlightSearchNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;Array.from(doc.body.querySelectorAll("span, p, div, h1, h2, h3, h4, h5, h6 ")).filter(node=>{const content=node.textContent||"";return content.trim()&&content.toLowerCase().indexOf(text.toLowerCase())>-1}).forEach(node=>{const walkAndProcess=node=>{let hasReplaced=(node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"";let lowerContent=content.toLowerCase(),lowerText=text.toLowerCase(),matches=[],index=lowerContent.indexOf(lowerText);for(;index>-1;)matches.push({start:index,end:index+text.length,originalText:content.substring(index,index+text.length)}),index=lowerContent.indexOf(lowerText,index+1);if(matches.length>0){const fragment=doc.createDocumentFragment();let lastEnd=0;return matches.forEach(match=>{match.start>lastEnd&&fragment.appendChild(doc.createTextNode(content.substring(lastEnd,match.start)));const highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.setAttribute("class","kookit-highlight-text"),highlightSpan.textContent=match.originalText,fragment.appendChild(highlightSpan),lastEnd=match.end}),lastEnd{var isVisible=!1;const computedStyle=getComputedStyle(el);if("none"===computedStyle.display||"hidden"===computedStyle.visibility||"0"===computedStyle.opacity)return!1;var rect=el.getBoundingClientRect();if(0===rect.width||0===rect.height)return!1;const vertical=isVerticalLayout()&&"scroll"!==readerMode;if(vertical&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>-10&&elemTop<=element.clientHeight}else if("scroll"!==readerMode&&!vertical&&el.textContent&&el.textContent.trim()){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=element.clientWidth}else if("scroll"===readerMode&&el.textContent&&el.textContent.trim()){let elemTop=rect.top;isVisible=elemTop>=element.scrollTop&&elemTop<=element.scrollTop+element.clientHeight}else if("scroll"===readerMode||vertical){if(vertical){let elemTop=rect.top;isVisible=elemTop>=0&&elemTop<=element.clientHeight}}else{let elemLeft=rect.left;isVisible=elemLeft>=0&&elemLeft<=element.clientWidth}return isVisible};class EventEmitter{constructor(){this.callbacks={},this.callbacks.base={}}on(_names,callback){const that=this;if(void 0===_names||""===_names)return console.warn("wrong names"),!1;if(void 0===callback)return console.warn("wrong callback"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);that.callbacks[name.namespace]instanceof Object||(that.callbacks[name.namespace]={}),that.callbacks[name.namespace][name.value]instanceof Array||(that.callbacks[name.namespace][name.value]=[]),that.callbacks[name.namespace][name.value].push(callback)}),this}off(_names){const that=this;if(void 0===_names||""===_names)return console.warn("wrong name"),!1;return this.resolveNames(_names).forEach(function(_name){const name=that.resolveName(_name);if("base"!==name.namespace&&""===name.value)delete that.callbacks[name.namespace];else if("base"===name.namespace)for(const namespace in that.callbacks)that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&(delete that.callbacks[namespace][name.value],0===Object.keys(that.callbacks[namespace]).length&&delete that.callbacks[namespace]);else that.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]instanceof Array&&(delete that.callbacks[name.namespace][name.value],0===Object.keys(that.callbacks[name.namespace]).length&&delete that.callbacks[name.namespace])}),this}trigger(_name,_args=[]){if(void 0===_name||""===_name)return console.warn("wrong name"),!1;const that=this;const args=_args instanceof Array?_args:[];let name=this.resolveNames(_name);name=this.resolveName(name[0]),setTimeout(()=>{if("base"===name.namespace)for(const namespace in that.callbacks){if(that.callbacks[namespace]instanceof Object&&that.callbacks[namespace][name.value]instanceof Array&&that.callbacks[namespace][name.value])that.callbacks[namespace][name.value].forEach(function(callback){callback.apply(that,args)});else if(this.callbacks[name.namespace]instanceof Object&&that.callbacks[name.namespace][name.value]){if(""===name.value)return console.warn("wrong name"),this;that.callbacks[name.namespace][name.value].forEach(function(callback){callback.apply(that,args)})}return null}},100)}resolveNames(_names){let names=_names;return names=names.replace(/[^a-zA-Z0-9 ,/.]/g,""),names=names.replace(/[,/]+/g," "),names=names.split(" "),names}resolveName(name){const newName={},parts=name.split(".");return newName.original=name,newName.value=parts[0],newName.namespace="base",parts.length>1&&""!==parts[1]&&(newName.namespace=parts[1]),newName}}const ELEMENT_NODE=Node.ELEMENT_NODE,TEXT_NODE=Node.TEXT_NODE,CDATA_SECTION_NODE=Node.CDATA_SECTION_NODE;function cfiEscape(str){return str.replace(/[\[\]\^,();]/g,"^$&")}function calcSiblingCount(nodes,n,offset){let lastWasElement,i,node,count=0,prevOffset=0,firstNode=!0;for(i=0;ithis.compare(a,b))}static compare(a,b){let oA=a.get(),oB=b.get();if(a.isRange||b.isRange){if(a.isRange&&b.isRange){const diff=this.comparePath(oA.from,oB.from);return diff||this.comparePath(oA.to,oB.to)}return a.isRange&&(oA=oA.from),b.isRange&&(oB=oB.from),this.comparePath(oA,oB)}return this.comparePath(oA,oB)}static compareParts(a,b){const max=Math.max(a.length,b.length);let i,cA,cB,diff;for(i=0;i=index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0}}else{if(cfiCount+=1,cfiCount===index)return"img"===child.tagName.toLowerCase()&&offset?{node:child,offset:offset}:{node:child,offset:0};if(cfiCount>index)return lastChild?{node:lastChild,offset:this.trueLength(dom,lastChild.textContent)}:{node:parentNode,offset:0}}lastChild=child;break;case TEXT_NODE:case CDATA_SECTION_NODE:if(0!==cfiCount&&cfiCount%2!=0||(cfiCount+=1),cfiCount===index){const trueLength=this.trueLength(dom,child.textContent);if(!(offset>=trueLength))return{node:child,offset:offset};offset-=trueLength}lastChild=child;break;default:continue}if(index>cfiCount){const o={relativeToNode:"after",offset:0};return o.node=lastChild||parentNode,this.isTextNode(o.node)&&(o.offset=this.trueLength(dom,o.node.textContent.length)),o}}isTextNode(node){return!!node&&(node.nodeType===TEXT_NODE||node.nodeType===CDATA_SECTION_NODE)}correctOffset(dom,node,offset,assertion){let matchStr,curNode=node;if("string"==typeof assertion?matchStr=this.decodeEntities(dom,assertion):(assertion.pre=this.decodeEntities(dom,assertion.pre),assertion.post=this.decodeEntities(dom,assertion.post),matchStr=assertion.pre+"."+assertion.post),!this.isTextNode(node))return{node:node,offset:0};for(;this.isTextNode(curNode.previousSibling);)curNode=curNode.previousSibling;const startNode=curNode;let str;const nodeLengths=[];let txt="",i=0;for(;this.isTextNode(curNode)&&(str=this.decodeEntities(dom,curNode.textContent),nodeLengths[i]=str.length,txt+=str,curNode.nextSibling);)curNode=curNode.nextSibling,i++;const matchOffset=assertion.pre?assertion.pre.length:0,m=function(str,regExp,add){add=add||0;const matches=[];let m,offset=0;do{if(m=str.match(regExp),!m)break;matches.push(m.index+add),offset+=m.index+m.length,str=str.slice(m.index+m.length)}while(offset=nodeLengths[i];){if(newOffset-=nodeLengths[i],newOffset<0)return{node:node,offset:offset};const nodeOffsets=[];if(!curNode.nextSibling||i+1>=nodeOffsets.length)return{node:node,offset:offset};i++,curNode=curNode.nextSibling}return{node:curNode,offset:newOffset}}resolveNode(index,subparts,dom,opts){if(opts=Object.assign({},opts||{}),!dom)throw new Error("Missing DOM argument");let startNode;if(0===index&&(startNode=dom.querySelector("package")),!startNode)for(const n of dom.childNodes)if(n.nodeType===ELEMENT_NODE){startNode=n;break}if(startNode=dom,!startNode)throw new Error("Document incompatible with CFIs");let i,subpart,node=startNode,startFrom=0;for(i=subparts.length-1;i>=0;i--)if(subpart=subparts[i],!opts.ignoreIDs&&subpart.nodeID&&(node=dom.getElementById(subpart.nodeID))){startFrom=i+1;break}node||(node=startNode);let o={node:node,offset:0};for(i=startFrom;ithis.parts.length-2)throw new Error("index is out of bounds");const subparts=this.parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);let node=this.resolveNode(index,subparts,dom,opts).node;const tagName=node.tagName.toLowerCase();if("itemref"===tagName&&"spine"===node.parentNode.tagName.toLowerCase()){const idref=node.getAttribute("idref");if(!idref)throw new Error("Referenced node had not 'idref' attribute");if(node=dom.getElementById(idref),!node)throw new Error("Specified node is missing from manifest");const href=node.getAttribute("href");if(!href)throw new Error("Manifest item is missing href attribute");return href}if("iframe"===tagName||"embed"===tagName){const src=node.getAttribute("src");if(!src)throw new Error(tagName+" element is missing 'src' attribute");return src}if("object"===tagName){const data=node.getAttribute("data");if(!data)throw new Error(tagName+" element is missing 'data' attribute");return data}if("image"===tagName||"use"===tagName){const href=node.getAttribute("xlink:href");if(!href)throw new Error(tagName+" element is missing 'xlink:href' attribute");return href}throw new Error("No URI found")}deepClone(o){return JSON.parse(JSON.stringify(o))}resolveLocation(dom,parts){const index=parts.length-1,subparts=parts[index];if(!subparts)throw new Error("Missing CFI part for index: "+index);const o=this.resolveNode(index,subparts,dom),lastPart=this.deepClone(subparts[subparts.length-1]);return delete lastPart.nodeIndex,lastPart.offset||delete o.offset,Object.assign(Object.assign({},lastPart),o)}resolveLast(dom,opts){if(opts=Object.assign({range:!1},opts||{}),!this.isRange)return this.resolveLocation(dom,this.parts);if(opts.range){const range=dom.createRange(),from=this.getFrom();"before"===from.relativeToNode?range.setStartBefore(from.node,from.offset):"after"===from.relativeToNode?range.setStartAfter(from.node,from.offset):range.setStart(from.node,from.offset);const to=this.getTo();return"before"===to.relativeToNode?range.setEndBefore(to.node,to.offset):"after"===to.relativeToNode?range.setEndAfter(to.node,to.offset):range.setEnd(to.node,to.offset),range}return{from:this.resolveLocation(dom,this.getFrom()),to:this.resolveLocation(dom,this.getTo()),isRange:!0}}resolve(doc,opts){return this.resolveLast(doc,opts)}}const getTooltipAnchorRect=element=>{const rect=element.getBoundingClientRect();return{left:rect.left,top:rect.top,right:rect.right,bottom:rect.bottom,width:rect.width,height:rect.height}},positionTooltipAboveRect=(tooltip,rect,doc,offset)=>{tooltip.style.left="0px",tooltip.style.top="0px",requestAnimationFrame(()=>{const vpW=doc.documentElement.clientWidth||window.innerWidth,vpH=doc.documentElement.clientHeight||window.innerHeight,tw=tooltip.offsetWidth,th=tooltip.offsetHeight;let left=rect.left+rect.width/2-tw/2,top=rect.top-th-offset;left<0&&(left=0),left+tw>vpW&&(left=Math.max(0,vpW-tw)),top<0&&(top=rect.bottom+offset,top+th>vpH&&(top=Math.max(0,vpH-th))),tooltip.style.left=left+"px",tooltip.style.top=top+"px"})},getNoteTooltipAnchorRect=(target,doc)=>{const noteKey=target.getAttribute("data-key");if(!noteKey)return getTooltipAnchorRect(target);return(elements=>{if(0===elements.length)return null;const rects=elements.map(element=>getTooltipAnchorRect(element)).filter(rect=>rect.width>0||rect.height>0);if(0===rects.length)return null;const left=Math.min(...rects.map(rect=>rect.left)),top=Math.min(...rects.map(rect=>rect.top)),right=Math.max(...rects.map(rect=>rect.right)),bottom=Math.max(...rects.map(rect=>rect.bottom));return{left:left,top:top,right:right,bottom:bottom,width:right-left,height:bottom-top}})(Array.from(doc.querySelectorAll(".kookit-note[data-key], .kookit-note-icon[data-key]")).filter(element=>element.getAttribute("data-key")===noteKey))||getTooltipAnchorRect(target)},showNoteTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-note-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-note-tooltip"),tooltip.setAttribute("class","kookit-note-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getNoteTooltipAnchorRect(target,doc),doc,10)},hideNoteTooltip=doc=>{const tooltip=doc.getElementById("kookit-note-tooltip");null==tooltip||tooltip.remove()},noteBatchGen=new WeakMap,bumpNoteBatchGen=doc=>{const gen=(noteBatchGen.get(doc)||0)+1;return noteBatchGen.set(doc,gen),gen},showNoteHighlightBatch=(notes,handleNoteClick,doc,iframe,isMobile)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView);const resolved=((notes,selection,doc,iWin)=>{var _a,_b;const resolved=new Array(notes.length),indices=[];for(let i=0;inotes[a].range.characterRange.start-notes[b].range.characterRange.start);let range=null,prevStart=0;for(let k=0;k{if(0===resolved.length)return void resolvePromise();const gen=bumpNoteBatchGen(doc),schedule=iWin&&"function"==typeof iWin.requestAnimationFrame?iWin.requestAnimationFrame.bind(iWin):callback=>setTimeout(callback,0);let index=0;const applyChunk=()=>{if(noteBatchGen.get(doc)!==gen)return void resolvePromise();const chunkStart=Date.now();let applied=0;for(;index{let pageElement=doc.querySelector(".noteLayer"),docLayer=doc.querySelector("#koodoPDFLayer");var viewport=page.getViewport({scale:scale});let rects=[];for(let i=0;i{rect.heighta.width-b.width),filteredRects=[];for(let i=0;i{if(otherIndex===i)return!1;const otherBottom=otherRect.bottom;return Math.abs(currentBottom-otherBottom)=currentRect.right||otherRect.left<=currentRect.left&&Math.abs(otherRect.right-currentRect.right)<5||Math.abs(otherRect.left-currentRect.left)<5&&otherRect.right>=currentRect.right)})||filteredRects.push(currentRect)}filteredRects.reduce((best,r)=>best?r.top{isNote&¬eContent&&showNoteTooltip(noteContent,event.currentTarget,doc)}),null==newNode||newNode.addEventListener("mouseleave",()=>{hideNoteTooltip(doc)}),null==newNode||newNode.addEventListener("click",event=>{event&&event.target&&event.target.dataset&&event.target.dataset.key&&handleNoteClick(event)}),newNode.ontouchend=event=>{var _a;if(!window.isSwiping){if(event&&event.target){let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_a=doc.getSelection())||void 0===_a?void 0:_a.toString().trim())||""),event.target.dataset&&event.target.dataset.key&&!selectedText&&handleNoteClick(event)}event.preventDefault(),event.stopPropagation()}},pageElement.appendChild(newNode))}},clearHighlight=doc=>{var _a;bumpNoteBatchGen(doc);const icons=doc.querySelectorAll(".kookit-note-icon");for(let index=0;index=0;index--){const element=elements[index],parent=element.parentNode;if(parent){if("SPAN"===element.tagName&&element.childNodes.length>0){for(;element.firstChild;)parent.insertBefore(element.firstChild,element);parentsToNormalize.add(parent)}parent.removeChild(element)}}parentsToNormalize.forEach(parent=>{parent.normalize()})},highlightRange=(range,colorCode,noteKey,handleNoteClick,doc,isNote=!1,isMobile=!1,noteContent="")=>{var _a,_b,_c,_d,_e;if(isMobile&&window.isSwiping){const waitAndHighlight=()=>{window.isSwiping?requestAnimationFrame(waitAndHighlight):highlightRange(range,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent)};return void requestAnimationFrame(waitAndHighlight)}const nativeRange=range.nativeRange,textNodes=[],walker=doc.createTreeWalker(nativeRange.commonAncestorContainer,NodeFilter.SHOW_TEXT,{acceptNode:node=>nativeRange.intersectsNode(node)?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_REJECT});for(;walker.nextNode();)textNodes.push(walker.currentNode);0===textNodes.length&&nativeRange.commonAncestorContainer.nodeType===Node.TEXT_NODE&&textNodes.push(nativeRange.commonAncestorContainer);const wrappedSpans=[],promotedSpans=new Set;for(let i=0;i=0;if(newStartBeforeOrAt&&newEndAfterOrAt){if(promotedSpans.has(existingNoteParent))continue;promotedSpans.add(existingNoteParent);const alreadyOuter=null===(_d=null===(_c=existingNoteParent.parentElement)||void 0===_c?void 0:_c.closest)||void 0===_d?void 0:_d.call(_c,`.kookit-note[data-key="${noteKey}"]`);if(alreadyOuter){wrappedSpans.push(alreadyOuter);continue}const span=doc.createElement("span");span.setAttribute("style",buildHighlightStyleForType(colorCode,!1,isVerticalLayout())),span.setAttribute("class","kookit-note"),span.setAttribute("data-key",noteKey),isNote&¬eContent&&span.setAttribute("data-note-content",noteContent),existingNoteParent.parentNode.insertBefore(span,existingNoteParent),span.appendChild(existingNoteParent),wrappedSpans.push(span);continue}}let startOffset=0,endOffset=textNode.textContent.length;textNode===nativeRange.startContainer&&(startOffset=nativeRange.startOffset),textNode===nativeRange.endContainer&&(endOffset=nativeRange.endOffset);let targetNode=textNode;startOffset>0&&(targetNode=textNode.splitText(startOffset),endOffset-=startOffset),endOffset{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");if(target){doc.body.style.cursor="pointer";const nc=target.getAttribute("data-note-content")||"";nc?showNoteTooltip(nc,target,doc):hideNoteTooltip(doc)}else doc.body.style.cursor="",hideNoteTooltip(doc)},!0),doc.body.addEventListener("mousedown",e=>{delegateDownX=e.clientX,delegateDownY=e.clientY},!0),doc.body.addEventListener("click",e=>{var _a,_b;if(Math.abs(e.clientX-delegateDownX)>5||Math.abs(e.clientY-delegateDownY)>5)return;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");target&&handleNoteClick({target:target})},!0),doc.body.addEventListener("touchend",e=>{var _a,_b,_c;if(window.isSwiping)return;const touch=e.changedTouches[0];if(!touch)return;const target=null===(_b=null===(_a=doc.elementFromPoint(touch.clientX,touch.clientY))||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-note[data-key]");let selectedText="";doc&&doc.getSelection()&&(selectedText=(null===(_c=doc.getSelection())||void 0===_c?void 0:_c.toString().trim())||""),target&&!selectedText&&(handleNoteClick({target:target}),e.preventDefault(),e.stopPropagation())},!0)}if(isNote&&wrappedSpans.length>0){const firstSpan=wrappedSpans[0],iconNode=doc.createElement("span");iconNode.setAttribute("class","kookit-note-icon"),iconNode.setAttribute("data-key",noteKey),iconNode.setAttribute("style","position: relative; z-index: 2; font-size: 14px; line-height: 1; cursor: pointer; pointer-events: auto;"),null===(_e=firstSpan.parentNode)||void 0===_e||_e.insertBefore(iconNode,firstSpan)}},showWordTooltip=(content,target,doc)=>{let tooltip=doc.getElementById("kookit-word-tooltip");tooltip||(tooltip=doc.createElement("span"),tooltip.setAttribute("id","kookit-word-tooltip"),tooltip.setAttribute("class","kookit-word-tooltip"),tooltip.setAttribute("style","position: fixed; z-index: 9999; max-width: 280px; padding: 6px 10px; background: #383838; color: #fff; font-size: 15px !important; border-radius: 6px; pointer-events: none; word-break: break-word; white-space: pre-wrap; line-height: 1.5;"),doc.body.appendChild(tooltip)),tooltip.textContent=content,tooltip.style.display="block",positionTooltipAboveRect(tooltip,getTooltipAnchorRect(target),doc,6)},hideWordTooltip=doc=>{const tooltip=doc.getElementById("kookit-word-tooltip");null==tooltip||tooltip.remove()},clearWordDefinitions=doc=>{const spans=doc.querySelectorAll(".kookit-word-def");for(let i=0;i{var _a;const words=Object.keys(definitionMap);if(0===words.length)return;const isCJK="zh"===lang||"ja"===lang,escapedWords=(isCJK?[...words].sort((a,b)=>b.length-a.length):words).map(w=>w.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")),pattern=isCJK?new RegExp("("+escapedWords.join("|")+")","g"):new RegExp("\\b("+escapedWords.join("|")+")\\b","gi"),walker=doc.createTreeWalker(rootElement||doc.body,NodeFilter.SHOW_TEXT,{acceptNode:node=>{let parent=node.parentElement;for(;parent;){const tag=parent.tagName;if("SCRIPT"===tag||"STYLE"===tag||"RUBY"===tag||parent.classList.contains("kookit-note")||parent.classList.contains("kookit-word-def")||parent.classList.contains("kookit-text-rule-replace")||parent.classList.contains("kookit-text-rule-delete")||parent.classList.contains("kookit-note-tooltip")||parent.classList.contains("kookit-word-tooltip"))return NodeFilter.FILTER_REJECT;parent=parent.parentElement}return NodeFilter.FILTER_ACCEPT}}),textNodes=[];for(;walker.nextNode();)textNodes.push(walker.currentNode);for(const textNode of textNodes){const text=textNode.textContent||"";if(pattern.lastIndex=0,!pattern.test(text))continue;pattern.lastIndex=0;const fragment=doc.createDocumentFragment();let match,lastIndex=0;for(;null!==(match=pattern.exec(text));){const before=text.slice(lastIndex,match.index);before&&fragment.appendChild(doc.createTextNode(before));const word=match[0],def=definitionMap[word.toLowerCase()]||definitionMap[word],span=doc.createElement("span");span.className="kookit-word-def";let fullDef,meaning=def.meaning||"";if("zhCN"===locale&&def.cn_meaning&&(meaning=def.cn_meaning),span.setAttribute("data-meaning",meaning||""),"zh"===lang)fullDef=["["+def.pinyin+"]"||"",meaning||"",def.level?"[HSK"+def.level+"]":""].filter(Boolean).join(" ");else if("ja"===lang){fullDef=[[def.furigana||"",def.romaji?"("+def.romaji+")":""].filter(Boolean).join(""),meaning||"",def.level?"[N"+def.level+"]":""].filter(Boolean).join(" ")}else fullDef=[def.pronunciation||"",meaning||"",def.level?"["+def.level+"]":""].filter(Boolean).join(" ");span.setAttribute("data-def-full",fullDef),span.appendChild(doc.createTextNode(word)),fragment.appendChild(span),lastIndex=match.index+word.length}if(0===lastIndex)continue;const after=text.slice(lastIndex);after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=textNode.parentNode)||void 0===_a||_a.replaceChild(fragment,textNode)}doc.body.__kookitWordDefDelegated||(doc.body.__kookitWordDefDelegated=!0,doc.body.addEventListener("mousemove",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc)}else hideWordTooltip(doc)},!0),doc.body.addEventListener("mouseleave",()=>{hideWordTooltip(doc)},!0),doc.body.addEventListener("touchend",e=>{var _a,_b;const target=null===(_b=null===(_a=e.target)||void 0===_a?void 0:_a.closest)||void 0===_b?void 0:_b.call(_a,".kookit-word-def");if(target){const fullDef=target.getAttribute("data-def-full")||"";showWordTooltip(fullDef,target,doc),null==e||e.preventDefault(),null==e||e.stopPropagation()}else{doc.getElementById("kookit-word-tooltip")&&(hideWordTooltip(doc),null==e||e.preventDefault(),null==e||e.stopPropagation())}},!0))};let flipAnimFrameId=null,flipAnimating=!1;const addPageAnimation=(totalPage,isDarkMode,backgroundColor,pageIndex=0)=>{flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null),flipAnimating=!1,function(sectionCount){let tempDiv=document.getElementById("book");tempDiv&&tempDiv.remove();const bookDiv=document.createElement("div");bookDiv.id="book";const canvas=document.createElement("canvas");canvas.id="pageflip-canvas";const pagesDiv=document.createElement("div");pagesDiv.id="pages";for(let i=0;i{!flips.length||pageNum>=flips.length||pageNum+1{!flips.length||pageNum<=0||pageNum-1>=0&&flips[pageNum-1]&&(flips[pageNum-1].target=1,pageNum=Math.max(pageNum-1,0))},setPageNum:n=>{flips.length&&(pageNum=Math.max(0,Math.min(n,flips.length-1)),resetFlips())},resetFlips:resetFlips,cleanup:()=>{flipAnimating=!1,flipAnimFrameId&&(cancelAnimationFrame(flipAnimFrameId),flipAnimFrameId=null);const canvasEl=document.getElementById("pageflip-canvas");canvasEl&&(canvasEl.style.willChange="",canvasEl.style.transform="")},mouseDownHandler:mouseDownHandler,mouseUpHandler:mouseUpHandler,mouseMoveHandler:mouseMoveHandler}}}function mouseMoveHandler(event){var _a;if(!book||!(null===(_a=event.touches)||void 0===_a?void 0:_a[0]))return;const touch=event.touches[0],bookRect=book.getBoundingClientRect();mouse.x=touch.screenX-bookRect.left-BOOK_WIDTH/2,mouse.y=touch.screenY-bookRect.top}function mouseDownHandler(event){var _a;const touch=null===(_a=event.touches)||void 0===_a?void 0:_a[0];touch&&(touchStartX=touch.screenX,touch.screenX=0?flips[pageNum-1].dragging=!0:touch.screenX>window.screen.width/2&&pageNum+1PAGE_WIDTH/4*1&&touchEndX-touchStartX>0?(flips[i].target=1,pageNum=Math.max(pageNum-1,0)):i===pageNum?flips[i].target=1:i===pageNum-1&&(flips[i].target=-1)),flips[i].dragging=!1}}function drawFlip(flip){var strength=1-Math.abs(flip.progress),foldWidth=.5*PAGE_WIDTH*(1-flip.progress),foldX=PAGE_WIDTH*flip.progress+foldWidth,verticalOutdent=20*strength,paperShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(1-flip.progress,.5),0),rightShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0),leftShadowWidth=.5*PAGE_WIDTH*Math.max(Math.min(strength,.5),0);flip.page.style.width=Math.max(foldX,0)+"px",context.save(),context.translate(0+BOOK_WIDTH/2,PAGE_Y+0),context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.05*strength+")",context.lineWidth=30*strength,context.beginPath(),context.moveTo(foldX-foldWidth,.5*-verticalOutdent),context.lineTo(foldX-foldWidth,PAGE_HEIGHT+.5*verticalOutdent),context.stroke();var rightShadowGradient=context.createLinearGradient(foldX,0,foldX+rightShadowWidth,0);rightShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.2*strength+")"),rightShadowGradient.addColorStop(.8,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),context.fillStyle=rightShadowGradient,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX+rightShadowWidth,0),context.lineTo(foldX+rightShadowWidth,PAGE_HEIGHT),context.lineTo(foldX,PAGE_HEIGHT),context.fill();var leftShadowGradient=context.createLinearGradient(foldX-foldWidth-leftShadowWidth,0,foldX-foldWidth,0);leftShadowGradient.addColorStop(0,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.0)"),leftShadowGradient.addColorStop(1,("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+.15*+strength+")"),context.fillStyle=leftShadowGradient,context.beginPath(),context.moveTo(foldX-foldWidth-leftShadowWidth,0),context.lineTo(foldX-foldWidth,0),context.lineTo(foldX-foldWidth,PAGE_HEIGHT),context.lineTo(foldX-foldWidth-leftShadowWidth,PAGE_HEIGHT),context.fill();var foldGradient=context.createLinearGradient(foldX-paperShadowWidth,0,foldX,0);backgroundColor?(foldGradient.addColorStop(.35,backgroundColor),foldGradient.addColorStop(.73,backgroundColor),foldGradient.addColorStop(.9,backgroundColor),foldGradient.addColorStop(1,backgroundColor)):"no"===isDarkMode?(foldGradient.addColorStop(.35,"#fafafa"),foldGradient.addColorStop(.73,"#eeeeee"),foldGradient.addColorStop(.9,"#fafafa"),foldGradient.addColorStop(1,"#e2e2e2")):(foldGradient.addColorStop(.35,"#333"),foldGradient.addColorStop(.73,"#444"),foldGradient.addColorStop(.9,"#333"),foldGradient.addColorStop(1,"#444")),context.fillStyle=foldGradient,context.strokeStyle=("no"===isDarkMode?"rgba(0,0,0,":"rgba(255,255,255,")+"0.06)",context.lineWidth=.5,context.beginPath(),context.moveTo(foldX,0),context.lineTo(foldX,PAGE_HEIGHT),context.quadraticCurveTo(foldX,PAGE_HEIGHT+2*verticalOutdent,foldX-foldWidth,PAGE_HEIGHT+verticalOutdent),context.lineTo(foldX-foldWidth,-verticalOutdent),context.quadraticCurveTo(foldX,2*-verticalOutdent,foldX,0),context.fill(),context.stroke(),context.restore()}function resetFlips(){for(var i=0;i{if("scroll"===readerMode)return;let scale="double"===readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;doc.body.setAttribute("style",`${"double"===readerMode?"position: absolute;":""}height: 100%;overflow-y: hidden;overflow-X: hidden;padding-left: 0px;padding-right: 0px;margin: 0px;box-sizing: border-box;touch-action: manipulation; overscroll-behavior: none;max-width: inherit;column-fill: auto;column-gap: ${gap}px; column-width: ${(doc.body.clientWidth-gap)/scale}px;`)},createPDFIframe=(chapterDocIndex,doc)=>{var _a;const iframeContainer=doc.getElementById("pdf-container-"+chapterDocIndex);if(!iframeContainer)return;let iframe=document.createElement("iframe");iframe.style.position="absolute",iframe.style.top="0",iframe.style.left="0",iframe.style.width="100%",iframe.style.height="100%",iframe.style.border="0",iframe.style.margin="0",iframe.style.padding="0",iframe.style.fontSize="100%",iframe.style.font="inherit",iframe.scrolling="no",iframe.tabIndex=0,iframe.id="pdf-iframe-"+chapterDocIndex;let style=document.createElement("style");return style.id="default-style",style.textContent="body{margin: 0px}",iframeContainer.appendChild(iframe),null===(_a=iframe.contentDocument)||void 0===_a||_a.head.appendChild(style),iframe},handleScrollPDFPosition=(chapterDocIndex,readerMode,doc)=>__awaiter(void 0,void 0,void 0,function*(){let targetNode=doc.getElementById("pdf-container-"+chapterDocIndex);if(targetNode)if("scroll"!==readerMode){let left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0;doc.body.scrollTo(left,0)}else targetNode.scrollIntoView()}),isPDFScrolledIntoView=(element,el,readerMode,doc)=>{var isVisible=!1,rect=el.getBoundingClientRect();if("scroll"!==readerMode){let elemLeft=rect.left;isVisible=elemLeft>-10&&elemLeft<=doc.body.clientWidth}else{let elemTop=rect.top,elemBottom=rect.bottom;isVisible=elemTop-10>=element.scrollTop&&elemTop+10<=element.scrollTop+element.clientHeight||elemBottom-10>=element.scrollTop&&elemBottom+10<=element.scrollTop+element.clientHeight||elemTop+10<=element.scrollTop&&elemBottom-10>=element.scrollTop+element.clientHeight}return isVisible},handleHighlightPDFNode=(text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const newStyle=(highlight.getAttribute("style")||"").replace(/background(?:-image|-repeat|-position|-size|-color)?\s*:[^;]+;?/gi,"").replace(/mix-blend-mode\s*:[^;]+;?/gi,"").replace(/border-(?:bottom|right)\s*:[^;]+;?/gi,"").replace(/text-decoration(?:-line|-style|-color|-thickness|-skip-ink)?\s*:[^;]+;?/gi,"").trim();newStyle?highlight.setAttribute("style",newStyle):highlight.removeAttribute("style"),highlight.removeAttribute("data-highlight")}),!text.trim())return;let nodes=((nodeList,text)=>{const nodes=Array.from(nodeList);if(!text||0===nodes.length)return[];const normalizedText=text.replace(/\s+/g," ").trim().replace(/[,.;:!?] (?=\S)/g,m=>m[0]);if(!normalizedText)return[];const lang=detectLocalLanguage$1(normalizedText),isCJK="zh"===lang||"ja"===lang||"ko"===lang,isSameLine=(prev,cur)=>{const prevRect=prev.getBoundingClientRect(),curRect=cur.getBoundingClientRect(),minH=Math.min(prevRect.height,curRect.height);return!(minH<=0)&&Math.abs(curRect.top-prevRect.top)<=.6*minH};let total="";const ranges=[];for(let i=0;i0&&!total.endsWith(" ")&&!piece.startsWith(" ")&&!isSameLine(nodes[i-1],nodes[i])&&(total.endsWith("-")?(total=total.slice(0,-1),ranges[ranges.length-1].end-=1):isCJK||(total+=" "));const start=total.length;total+=piece,ranges.push({start:start,end:total.length})}let normalizedTotal="";const posMap=[];let lastWasSpace=!0;for(let i=0;i=posMap.length?posMap[posMap.length-1]+1:posMap[endPos];let startIdx=-1,endIdx=-1;for(let i=0;irawStart&&start0)for(let i=0;i__awaiter(void 0,void 0,void 0,function*(){let section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1;const width=doc.body.clientWidth;if(playMimicalFlip(animation,isMobile,delta,flipToNextPage,flipToPrevPage),delta>0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex-1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy(-(width+gap)/2,0);else if(delta<0)if("single"===readerMode){let subContainer=doc.querySelector("#pdf-container-"+(chapterDocIndex+1));subContainer&&subContainer.scrollIntoView()}else doc.body.scrollBy((width+gap)/2,0)}),convertPageToImage=page=>__awaiter(void 0,void 0,void 0,function*(){const viewport=page.getViewport({scale:1}),canvas=document.createElement("canvas"),context=canvas.getContext("2d");canvas.width=800,canvas.height=800/viewport.width*viewport.height;const renderContext={canvasContext:context,viewport:page.getViewport({scale:800/viewport.width})};yield page.render(renderContext).promise;const imageURL=canvas.toDataURL("image/jpeg",.8),size=function(imageURL){const base64Length=imageURL.length-23;return Math.ceil(.75*base64Length)}(imageURL);return{imageURL:imageURL,size:size}});const showOCRProgress=progress=>{let bar=document.getElementById("ocr-progress-bar");bar||(bar=document.createElement("progress"),bar.id="ocr-progress-bar",bar.max=1,bar.value=0,bar.style.position="fixed",bar.style.top="10px",bar.style.left="50%",bar.style.transform="translateX(-50%)",bar.style.width="300px",bar.style.zIndex="9999",document.body.appendChild(bar)),bar.value=progress,progress>=1&&setTimeout(()=>{bar.remove()},1e3)},getTextFromPDFPage=(chapterDoc,titleSizeValue=1.2,paraSpacingValue=1.5)=>__awaiter(void 0,void 0,void 0,function*(){let textContent=yield chapterDoc.text.getTextContent(),paraList=[];if("string"==typeof textContent)paraList=textContent.split("\n").filter(line=>""!==line.trim()).map(line=>({text:line,isBold:!1}));else if(textContent&&textContent.items&&Array.isArray(textContent.items)){const fontSizes=textContent.items.filter(item=>item.str&&item.transform).map(item=>item.transform[3]);let baseFontSize=10;if(fontSizes.length>0){const fontSizeCount=fontSizes.reduce((acc,size)=>(acc[size]=(acc[size]||0)+1,acc),{});baseFontSize=Object.keys(fontSizeCount).map(Number).reduce((a,b)=>fontSizeCount[a]>fontSizeCount[b]?a:b)}let currentPara={text:"",styles:new Set,y:0,tag:"p"},lastY=0;textContent.items.forEach(item=>{if(item.str){const yDiff=Math.abs(item.transform[5]-lastY);let tag="p",isBold=item.transform[3]>Number(baseFontSize)*titleSizeValue;yDiff>item.height*paraSpacingValue&¤tPara.text.trim()?(paraList.push(currentPara),currentPara={text:"",styles:new Set,y:item.transform[5],tag:tag,isBold:isBold}):currentPara.hasOwnProperty("isBold")||(currentPara.isBold=isBold);const wrappedText=item.str;if(item.hasEOL)if(wrappedText.endsWith("-"))currentPara.text+=wrappedText.slice(0,-1);else{const lang=detectLocalLanguage$1(wrappedText+currentPara.text);currentPara.text+="zh"===lang||"ja"===lang||"ko"===lang?wrappedText:wrappedText+" "}else currentPara.text+=wrappedText;lastY=item.transform[5]}}),currentPara.text.trim()&¶List.push(currentPara)}return paraList}),cornerAt=(x,y,w,h)=>w<=0||h<=0||x<0||x>w||y<0||y>h?null:((x,y,w,h)=>{if(w<=0||h<=0)return null;const inEllipse=(dx,dy)=>Math.pow(dx/50,2)+Math.pow(dy/50,2)<=1;return inEllipse(w-x,h-y)?"br":inEllipse(x,y)?"tl":null})(x,y,w,h),isValidSelection=sel=>!!(sel&&sel.toString().trim().length>0&&sel.rangeCount>0),createSelectionAutoTurn=options=>{const{iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:enableScrollPin=!1}=options;if("scroll"===readerMode||"PDF"===format)return null;let autoTurnTimer=null,engagedCorner=null,isAutoTurning=!1,pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null,isTextSelected=!1,outerTouchCleanup=null,pointerOnlyUntilClear=!1;const viewportSize=()=>({w:doc.documentElement.clientWidth||doc.body.clientWidth||iframe.clientWidth,h:doc.documentElement.clientHeight||doc.body.clientHeight||iframe.clientHeight}),toIframeCoords=(clientX,clientY)=>{const iframeRect=iframe.getBoundingClientRect();return{x:clientX-iframeRect.left,y:clientY-iframeRect.top}},pointerCornerNow=()=>{const p=pointerPos;if(!p)return null;const{w:w,h:h}=viewportSize();return cornerAt(p.x,p.y,w,h)},caretCornerNow=()=>{const sel=doc.getSelection();if(!sel||!isValidSelection(sel))return null;const pos=((doc,sel)=>{var _a;const focusNode=sel.focusNode;if(!focusNode)return null;let rect;try{const range=doc.createRange(),offset=focusNode.nodeType===Node.TEXT_NODE?Math.min(sel.focusOffset,(null!==(_a=focusNode.textContent)&&void 0!==_a?_a:"").length):sel.focusOffset;range.setStart(focusNode,offset),range.collapse(!0),rect=range.getBoundingClientRect()}catch(_b){return null}return 0===rect.width&&0===rect.height&&0===rect.left&&0===rect.top?null:{x:(rect.left+rect.right)/2,y:(rect.top+rect.bottom)/2}})(doc,sel);if(!pos)return null;const{w:w,h:h}=viewportSize();return cornerAt(pos.x,pos.y,w,h)},inCorner=c=>(pointerCornerNow()||(pointerOnlyUntilClear?null:caretCornerNow()))===c,cancelAutoTurn=()=>{engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)},detachOuterTouch=()=>{null==outerTouchCleanup||outerTouchCleanup(),outerTouchCleanup=null},attachOuterTouch=()=>{var _a;detachOuterTouch();const parentWin=null===(_a=iframe.ownerDocument)||void 0===_a?void 0:_a.defaultView,iframeWin=doc.defaultView;if(!parentWin&&!iframeWin)return;const onIframeTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];touch&&(pointerPos={x:touch.clientX,y:touch.clientY},noteCorner(pointerCornerNow()))},onOuterTouch=event=>{if(!isTextSelected)return;const touch=event.touches[0];if(!touch)return;const coords=toIframeCoords(touch.clientX,touch.clientY);pointerPos=coords,noteCorner(pointerCornerNow())},onPointer=event=>{if(!isTextSelected)return;const coords=event.view===iframeWin?{x:event.clientX,y:event.clientY}:toIframeCoords(event.clientX,event.clientY);pointerPos=coords,noteCorner(pointerCornerNow())};null==iframeWin||iframeWin.addEventListener("touchmove",onIframeTouch,{capture:!0,passive:!0}),null==iframeWin||iframeWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),null==parentWin||parentWin.addEventListener("touchmove",onOuterTouch,{capture:!0,passive:!0}),parentWin&&parentWin!==iframeWin&&parentWin.addEventListener("pointermove",onPointer,{capture:!0,passive:!0}),outerTouchCleanup=()=>{null==iframeWin||iframeWin.removeEventListener("touchmove",onIframeTouch,{capture:!0}),null==iframeWin||iframeWin.removeEventListener("pointermove",onPointer,{capture:!0}),null==parentWin||parentWin.removeEventListener("touchmove",onOuterTouch,{capture:!0}),parentWin&&parentWin!==iframeWin&&parentWin.removeEventListener("pointermove",onPointer,{capture:!0})}},noteCorner=corner=>{isAutoTurning||(corner?engagedCorner!==corner&&(engagedCorner=corner,(corner=>{autoTurnTimer||(autoTurnTimer=setTimeout(()=>{autoTurnTimer=null;const sel=doc.getSelection();if(isAutoTurning||!sel||!isValidSelection(sel)||!inCorner(corner))return;isAutoTurning=!0;const turning="br"===corner?render.next():render.prev();Promise.resolve(turning).finally(()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,isAutoTurning=!1,engagedCorner=corner,pointerOnlyUntilClear=!0})},500))})(corner)):engagedCorner&&!inCorner(engagedCorner)&&(engagedCorner=null,autoTurnTimer&&(clearTimeout(autoTurnTimer),autoTurnTimer=null)))},onSelectionCleared=()=>{isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),detachOuterTouch(),pinnedScrollLeft=null,pinnedScrollTop=null,pointerPos=null};return{onSelectStart:()=>{pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop,pointerPos=null,isTextSelected=!1,pointerOnlyUntilClear=!1,cancelAutoTurn(),attachOuterTouch()},onSelectionChange:()=>{const sel=doc.getSelection();isValidSelection(sel)?(isTextSelected=!0,null===pinnedScrollLeft&&(pinnedScrollLeft=doc.body.scrollLeft,pinnedScrollTop=doc.body.scrollTop),outerTouchCleanup||attachOuterTouch(),pointerOnlyUntilClear||noteCorner(caretCornerNow())):onSelectionCleared()},onTouchMove:(clientX,clientY)=>{pointerPos={x:clientX,y:clientY},noteCorner(pointerCornerNow())},onSelectionCleared:onSelectionCleared,cancelAutoTurn:cancelAutoTurn,applyScrollPin:()=>{enableScrollPin&&isTextSelected&&!isAutoTurning&&null!==pinnedScrollLeft&&(doc.body.scrollLeft!==pinnedScrollLeft&&(doc.body.scrollLeft=pinnedScrollLeft),null!==pinnedScrollTop&&pinnedScrollTop>0&&doc.body.scrollTop!==pinnedScrollTop&&(doc.body.scrollTop=pinnedScrollTop))},hasActiveSelection:()=>isTextSelected}};let isDragging=!1,lastPinchZoomTime=0,pinchZoomed=!1;const isPaginatedFormat=format=>"PDF"===format||format&&format.startsWith("CB"),slideAnimateTo=(direction,format,doc,outerDoc,element,render,gap)=>{let pageWidth=element.clientWidth+gap,tempDoc=isPaginatedFormat(format)?outerDoc:doc;if(isDragging=!1,window.scrollAnimationId&&(cancelAnimationFrame(window.scrollAnimationId),window.scrollAnimationId=null),Math.abs(tempDoc.body.scrollWidth-tempDoc.body.scrollLeft-element.clientWidth)<10&&"right"===direction)return void render.next();if(0===tempDoc.body.scrollLeft&&"left"===direction)return void render.prev();let snapX,scrollLeft=tempDoc.body.scrollLeft;const currentPage=Math.round(scrollLeft/pageWidth);snapX="left"===direction?(currentPage-1)*pageWidth:"right"===direction?(currentPage+1)*pageWidth:currentPage*pageWidth;const maxScroll=tempDoc.body.scrollWidth-element.clientWidth;(snapX>=maxScroll||tempDoc.body.scrollWidth-snapX{if(resolved)return;null===startTime&&(startTime=now);const progress=Math.min(1,(now-startTime)/250);body.scrollLeft=startLeft+distance*(t=>1-Math.pow(1-t,3))(progress),progress<1?window.scrollAnimationId=requestAnimationFrame(step):resolved||(resolved=!0,body.style.willChange="",body.scrollLeft=snapX,render.record(),isDragging=!1,window.isSwiping=!1)};window.scrollAnimationId=requestAnimationFrame(step)};function blobUrlToBase64(blobUrl){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(blobUrl),blob=yield response.blob();return yield new Promise((resolve,reject)=>{const reader=new FileReader;reader.onloadend=()=>resolve(reader.result),reader.onerror=reject,reader.readAsDataURL(blob)})}catch(error){throw console.error("转换失败:",error),error}})}function getScreenLeftOffset(){return window.visualViewport?window.visualViewport.offsetLeft:window.pageXOffset||document.documentElement.scrollLeft||0}function getScreenTopOffset(){return window.visualViewport?window.visualViewport.offsetTop:window.pageYOffset||document.documentElement.scrollTop||0}const preventLinkNavigation=(event,doc,render)=>__awaiter(void 0,void 0,void 0,function*(){if(!event.target)return;let href=render.getTargetHref(event);if(!href)return;event.preventDefault(),event.stopPropagation();let beforeLocation=Object.assign({},render.getPosition()),result=yield render.handleLinkJump(href,event);if(!result.handled)return!1;if(result.external)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:""},result))),!0;if(result.redirectChapter)return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",bookLocation:beforeLocation},result))),!0;if(!result.node)return!0;let footnoteResult=yield render.getFootnoteContent(result.node);return window.ReactNativeWebView.postMessage(JSON.stringify(Object.assign({event:"link-clicked",href:href,footnote:footnoteResult.handled?footnoteResult.content:"",rect:event.target.getBoundingClientRect()},result))),!0});function findLinkElement(element){if("A"===element.tagName)return element;let currentElement=element;for(;currentElement&&"BODY"!==currentElement.tagName;){if("A"===currentElement.tagName)return currentElement;currentElement=currentElement.parentElement}return null}function getTouchAction(col,row,touchControlRule){const areaIndex=3*row+col+1;return touchControlRule.layout.A.area.includes(areaIndex)?touchControlRule.touchControlA:touchControlRule.layout.B.area.includes(areaIndex)?touchControlRule.touchControlB:touchControlRule.layout.C.area.includes(areaIndex)?touchControlRule.touchControlC:"right"}const getSelectionSentence=doc=>{var _a,_b,_c;let sel=doc.getSelection();if(!sel||!sel.toString().trim())return"";try{let container=sel.getRangeAt(0).commonAncestorContainer,fullText=(null===(_a=container.nodeType===Node.TEXT_NODE?container.parentElement:container)||void 0===_a?void 0:_a.textContent)||"",selectedText=sel.toString().trim(),sentences=null!==(_c=null===(_b=fullText.match(/[^.!?。!?]*[.!?。!?]?/g))||void 0===_b?void 0:_b.filter(s=>s.length>0))&&void 0!==_c?_c:[];for(let s of sentences)if(s.includes(selectedText))return s.trim();return fullText.trim().substring(0,200)}catch(_d){}return""},addAndroidTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRule,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;element.clientWidth;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!0});let lastTouchX=0;doc.addEventListener("touchend",function(event){window.isSwiping=!1,doc.body.style.transform="";let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now,function(event,render,format){var _a;if(!pinchZoomed)return;if(pinchZoomed=!1,"PDF"!==format)return;if(window.visualViewport.scale<=1.01)return;let now=Date.now();if(now-lastPinchZoomTime<1e3)return;lastPinchZoomTime=now;let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;window.ReactNativeWebView.postMessage(JSON.stringify({event:"pinch-zoom",chapterDocIndex:chapterDocIndex,scale:window.visualViewport.scale})),render.handleRenderPDFChapter(chapterDocIndex,!0)}(event,render,format);const touch=event.changedTouches[0],touchEndTime=Date.now();let touchEndX=touch.screenX,touchEndY=touch.screenY;const timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touch.screenXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}var selectedText=iWin.getSelection().toString(),isSwiping=Math.abs(distX)>=30||Math.abs(distY)>=30;if(!selectedText||isPaginatedFormat(format)&&isSwiping){if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){var cellWidth=window.innerWidth/3,cellHeight=window.innerHeight/3,result=getTouchAction(Math.floor(touchEndX/cellWidth),Math.floor(touchEndY/cellHeight),touchControlRule);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text-after-touch",selectedText:selectedText}))},!1),doc.addEventListener("touchstart",function(event){touchStartTime=Date.now();const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(event.preventDefault(),pinchZoomed=!0);const touch=event.touches[0];touchStartX=touch.screenX,touchStartY=touch.screenY},!1),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(event.preventDefault(),window.visualViewport.scale>1&&isPaginatedFormat(format))return void event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if((Math.abs(distX)>10||Math.abs(distY)>10)&&(window.isSwiping=!0),!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,doc.body.style.transform="translateZ(0)","mimical"===animation&&"scroll"!==readerMode){let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},!1),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0);let startSelectionTime=0,selectionCount=0,triggerSelectionMenu=event=>__awaiter(void 0,void 0,void 0,function*(){var _b,_c;const selectedText=iWin.getSelection().toString().trim();if(selectedText){var range=iWin.getSelection().getRangeAt(0);let pageSize=render.getPageSize();var rect=range.getBoundingClientRect();if("PDF"===format){let clientRects=range.getClientRects();if(clientRects.length>0){clientRects=Array.from(clientRects).filter(item=>Math.abs(item.height-pageSize.sectionHeight)>10&&Math.abs(item.width-pageSize.sectionWidth)>10&&item.height>0&&item.width>0);let minTop=1/0,minLeft=1/0,maxBottom=-1/0,maxRight=-1/0;for(let i=0;i{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}return Date.now()-startSelectionTime<100?setTimeout(()=>{1===selectionCount&&triggerSelectionMenu(event)},600):triggerSelectionMenu(event),event.preventDefault(),event.stopPropagation(),!1}};let scrollLeft=0,scrollTop=0,offsetLeft=0,offsetTop=0;doc.addEventListener("selectstart",event=>{selectionCount=0,startSelectionTime=Date.now(),offsetLeft=getScreenLeftOffset(),offsetTop=getScreenTopOffset(),"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart(),"PDF"===format&&(scrollLeft=doc.body.scrollLeft,scrollTop=doc.body.scrollTop))},!1);let lastSelectionChangeTime=0;let selectionMenuTimer=null;doc.addEventListener("selectionchange",event=>{"PDF"!==format&&(selectionMenuTimer&&clearTimeout(selectionMenuTimer),selectionMenuTimer=setTimeout(()=>{triggerSelectionMenu(event),selectionMenuTimer=null},1e3));if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());selectionAutoTurn?selectionAutoTurn.onSelectionChange():(scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),scrollTop>0&&(doc.body.scrollTop=scrollTop)),selectionCount++;const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},!1),doc.addEventListener("scroll",()=>{if("single"===readerMode||"double"===readerMode)if(selectionAutoTurn)selectionAutoTurn.applyScrollPin();else{const selectedText=iWin.getSelection().toString().trim();selectedText&&scrollLeft>0&&(doc.body.scrollLeft=scrollLeft),selectedText&&scrollTop>0&&(doc.body.scrollTop=scrollTop)}})},addAppleTouchEvent=(doc,iframe,element,readerMode,animation,format,touchControlRules,render)=>{var _a;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),outerDoc=render.getDocument(),touchStartTime=0,touchStartX=0,touchStartY=0,lastTouchEnd=0;let section=Math.floor(element.clientWidth/12),gap=section%2==0?section:section-1;const selectionAutoTurn=createSelectionAutoTurn({element:element,iframe:iframe,doc:doc,render:render,readerMode:readerMode,format:format,enableScrollPin:!1});let lastTouchX=0;doc.addEventListener("touchend",function(event){var _a,_b;return __awaiter(this,void 0,void 0,function*(){window.isSwiping=!1;let now=(new Date).getTime();if(now-lastTouchEnd<=300&&(event.preventDefault(),"yes"!==render.isParagraphMode&&"yes"!==render.isSpeedReading&&"yes"!==render.isReadingRuler))return;lastTouchEnd=now;const touch=event.changedTouches[0],touchEndTime=Date.now(),touchEndX=touch.screenX,touchEndY=touch.screenY,timeDiff=touchEndTime-touchStartTime,distX=touchEndX-touchStartX,distY=touchEndY-touchStartY;if(isDragging&&("mimical"===animation||"none"===animation)&&"scroll"!==readerMode)return isDragging=!1,render.mouseUpHandler(event),touchEndXwindow.innerWidth/4*1&&touchEndX-touchStartX>0&&(render.prev(),isDragging=!1),void setTimeout(()=>{let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="none")},400);if(isDragging&&"sliding"===animation&&"scroll"!==readerMode){const dragPercentage=Math.abs(distX)/window.innerWidth,dragThreshold=.1;return void slideAnimateTo(distX>0&&dragPercentage>dragThreshold?"left":distX<0&&dragPercentage>dragThreshold?"right":"stay",format,doc,outerDoc,element,render,gap)}const selectedText=iWin.getSelection().toString().trim();if(selectedText){var rect=iWin.getSelection().getRangeAt(0).getBoundingClientRect(),pageSize=render.getPageSize(),position={top:rect.top-element.scrollTop,left:rect.left,width:rect.width,height:rect.height,screenWidth:window.innerWidth,screenHeight:window.innerHeight,sectionHeight:pageSize.sectionHeight,sectionWidth:pageSize.sectionWidth,gap:pageSize.gap,scale:window.visualViewport.scale,offsetLeft:getScreenLeftOffset(),offsetTop:getScreenTopOffset()};rangy.init();let charRange=null;if("PDF"===format){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;position.chapterDocIndex=chapterDocIndex+"",charRange=yield render.getHighlightCoords(chapterDocIndex);let subContainer=targetIframe.parentElement;subContainer&&(position.top=position.top+parseFloat(subContainer.getBoundingClientRect().top))}else charRange=yield render.getHighlightCoords();let sentence=getSelectionSentence(doc);return void window.ReactNativeWebView.postMessage(JSON.stringify({event:"select-text",selectedText:selectedText,sentence:sentence,position:position,range:charRange}))}if(selectedText||null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared(),timeDiff>500){const target=event.target;if(!target)return;if(findLinkElement(target))return;if(Math.abs(distX)<30&&Math.abs(distY)<30&&("IMG"===target.tagName||"image"===target.tagName)){const imgSrc=target.src||target.getAttribute("xlink:href");return void(imgSrc.startsWith("blob:")&&blobUrlToBase64(imgSrc).then(base64=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"view-image",imgSrc:base64}))}))}}if(timeDiff<500&&Math.abs(distX)<30&&Math.abs(distY)<30){const width=document.documentElement.clientWidth,height=document.documentElement.clientHeight;let normalizedX=Math.min(Math.max(touchEndX,0),width),normalizedY=Math.min(Math.max(touchEndY,0),height);if(isPaginatedFormat(format)&&"double"===readerMode){let ownerDoc=event.target.ownerDocument,targetIframe=null===(_b=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_b?void 0:_b.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"";(id?parseInt(id.split("-").reverse()[0]):0)%2==1&&(normalizedX+=width/2)}const cellWidth=width/3,cellHeight=height/3;let result=getTouchAction(Math.min(Math.floor(normalizedX/cellWidth),2),Math.min(Math.floor(normalizedY/cellHeight),2),touchControlRules);if("yes"===render.isParagraphMode||"yes"===render.isSpeedReading||"yes"===render.isReadingRuler){if("right"===result)return void render.next();if("left"===result)return void render.prev()}if("sliding"===animation&&"scroll"!==readerMode){if("right"===result)return void slideAnimateTo("right",format,doc,outerDoc,element,render,gap);if("left"===result)return void slideAnimateTo("left",format,doc,outerDoc,element,render,gap)}window.ReactNativeWebView.postMessage(JSON.stringify({event:result}))}else(Math.abs(distX)>=30||Math.abs(distY)>=30)&&(window.ReactNativeWebView.postMessage(JSON.stringify({event:"swipe"})),"scroll"===readerMode&&Math.abs(element.scrollHeight-element.scrollTop-element.clientHeight)<10&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-bottom"})),"scroll"===readerMode&&0===element.scrollTop&&window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-top"})))})},{passive:!1}),doc.addEventListener("touchstart",function(event){const target=event.target;if(!target)return;if(findLinkElement(target))return;event.touches.length>1&&(pinchZoomed=!0);const touch=event.touches[0];touchStartTime=Date.now(),touchStartX=touch.screenX,touchStartY=touch.screenY},{passive:!1}),doc.addEventListener("touchmove",function(event){if(iWin.getSelection().toString().trim()){const touch=event.touches[0];return void(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(touch.clientX,touch.clientY))}if(!isDragging&&Math.abs(event.touches[0].screenX-touchStartX)<=10)return;if(window.visualViewport.scale>1&&isPaginatedFormat(format))return;"scroll"!==readerMode&&event.preventDefault();const touch=event.touches[0],touchCurrentX=touch.screenX,touchCurrentY=touch.screenY,distX=touchCurrentX-touchStartX,distY=touchCurrentY-touchStartY;if(!isDragging&&Math.abs(distX)>Math.abs(distY)&&Math.abs(distX)>10){if(isDragging=!0,lastTouchX=touchCurrentX,"mimical"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let bookDiv=document.getElementById("book");bookDiv&&(bookDiv.style.display="block",render.mouseDownHandler(event))}}else if(isDragging&&"mimical"===animation&&"scroll"!==readerMode&&render.mouseMoveHandler(event),isDragging&&"sliding"===animation&&"scroll"!==readerMode){window.isSwiping=!0;let tempDoc=isPaginatedFormat(format)?outerDoc:doc;const deltaX=touchCurrentX-lastTouchX,currentScrollLeft=tempDoc.body.scrollLeft;tempDoc.body.scrollLeft=currentScrollLeft-deltaX,lastTouchX=touchCurrentX,requestAnimationFrame(()=>{})}},{passive:!1}),doc.addEventListener("pointermove",event=>{iWin.getSelection().toString().trim()&&(null==selectionAutoTurn||selectionAutoTurn.onTouchMove(event.clientX,event.clientY))},{passive:!0}),doc.addEventListener("click",event=>{preventLinkNavigation(event,0,render)},!0),doc.body.oncontextmenu=function(event){return event.preventDefault(),event.stopPropagation(),!1},doc.addEventListener("selectstart",()=>{"scroll"!==readerMode&&(null==selectionAutoTurn||selectionAutoTurn.onSelectStart())},!1);let lastSelectionChangeTime=0;doc.addEventListener("selectionchange",event=>{if(!iWin.getSelection().toString().trim())return void(null==selectionAutoTurn||selectionAutoTurn.onSelectionCleared());null==selectionAutoTurn||selectionAutoTurn.onSelectionChange();const now=Date.now();now-lastSelectionChangeTime>=3e3&&(lastSelectionChangeTime=now,window.ReactNativeWebView.postMessage(JSON.stringify({event:"selection-change"})))},{passive:!1})},NO_SPACE_SCRIPT_REGEX=/[\u3000-\u303f\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uff00-\uff9f\u0e00-\u0e7f\u0e80-\u0eff\u1000-\u109f\u1780-\u17ff]/,segmenterCache={},isPunctuationOnly=word=>/^[^\w\u3040-\u30ff\u3400-\u4dbf\u4e00-\u9fff\uf900-\ufaff\uac00-\ud7af\u1100-\u11ff\u3130-\u318f\u0e01-\u0e3a\u0e40-\u0e4e\u0e50-\u0e59\u0e80-\u0eff\u1000-\u109f\u1780-\u17b3\u17e0-\u17e9\uff10-\uff19\uff21-\uff3a\uff41-\uff5a]+$/.test(word),mergePunctuationToPrevWord=words=>{const merged=[];for(const word of words)merged.length>0&&isPunctuationOnly(word)?merged[merged.length-1]+=word:merged.push(word);return merged},segmentSpeedReadingWords=text=>{if(!text||!text.trim())return[];if((text=>!!text&&NO_SPACE_SCRIPT_REGEX.test(text))(text)){const segmenter=(lang=>{if(void 0===Intl.Segmenter)return null;const key=lang||"default";return segmenterCache[key]||(segmenterCache[key]=new Intl.Segmenter(lang||void 0,{granularity:"word"})),segmenterCache[key]})();if(segmenter){const words=Array.from(segmenter.segment(text)).map(segment=>segment.segment).filter(segment=>segment.trim().length>0);return mergePunctuationToPrevWord(words)}return mergePunctuationToPrevWord(Array.from(text).filter(char=>char.trim().length>0))}return text.split(/\s+/).filter(word=>word.length>0)};class SpeedReadingManager{constructor(config={}){this.isSpeedReading="no",this.speedReadingSpeed=300,this.isDarkMode="no",this.readerMode="single",this.words=[],this.index=0,this.timer=null,this.countdownTimer=null,this.playing=!1,this.autoStarted=!1,this.hasStartedOnce=!1,this.overlayEl=null,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getOverlayBackground=()=>"#ffffff",this.getProgress=()=>null,this.getChapterDocIndex=()=>"0",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.isDarkMode=config.isDarkMode||"no",this.readerMode=config.readerMode||"single"}applyConfig(config={}){null!=config.isSpeedReading&&(this.isSpeedReading=config.isSpeedReading),null!=config.speedReadingSpeed&&(this.speedReadingSpeed=config.speedReadingSpeed),null!=config.isDarkMode&&(this.isDarkMode=config.isDarkMode)}isSpeedReadingActive(){return"yes"===this.isSpeedReading}extractWords(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let texts=getVisibleText(element,this.readerMode,doc),words=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item))){return.299*parts[0]+.587*parts[1]+.114*parts[2]>128?"#333333":"#f5f5f5"}}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return.299*parseInt(full.slice(0,2),16)+.587*parseInt(full.slice(2,4),16)+.114*parseInt(full.slice(4,6),16)>128?"#333333":"#f5f5f5"}return"yes"===this.isDarkMode?"#f5f5f5":"#333333"}updateOverlay(){let doc=this.getDoc();if(!doc||!doc.body)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");if(!this.isSpeedReadingActive())return overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),void(overlay===this.overlayEl&&(this.overlayEl=null));if(overlay)overlay!==this.overlayEl&&(this.overlayEl=overlay);else{overlay=doc.createElement("div"),overlay.id="kookit-speed-reading-overlay",this.overlayEl=overlay;const pageHeight=this.getPageHeight(),isScrollMode="scroll"===this.readerMode,position=isScrollMode?"absolute":"fixed",visibilityTop=isScrollMode?convertStyleNum(this.getElement().scrollTop):0,element=this.getElement(),height=isScrollMode?element.clientHeight:doc.defaultView?doc.defaultView.innerHeight:pageHeight;overlay.style.cssText=`position:${position};left:0;width:100%;top:${isScrollMode?visibilityTop:0}px;height:${Math.max(0,height)}px;z-index:2147483000;display:flex;flex-direction:column;align-items:center;justify-content:center;padding-bottom:${Math.round(.2*pageHeight)}px;user-select:none;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;pointer-events:none;`,overlay.style.backgroundColor=this.getOverlayBackground(doc);let wordArea=doc.createElement("div");wordArea.id="kookit-speed-reading-word-area",wordArea.style.cssText=`position:relative;display:flex;align-items:baseline;width:80%;max-width:900px;font-weight:600;line-height:1.6;font-size:${this.getWordFontSize()}px !important;transition:background-color 0.3s ease;pointer-events:none;`;let left=doc.createElement("span");left.id="kookit-speed-reading-word-left",left.style.cssText=`flex:1;text-align:right;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let pivot=doc.createElement("span");pivot.id="kookit-speed-reading-word-pivot",pivot.style.cssText=`color:#ff3b30 !important;white-space:pre;position:relative;font-size:${this.getWordFontSize()}px !important;overflow:visible;`;let right=doc.createElement("span");right.id="kookit-speed-reading-word-right",right.style.cssText=`flex:1;text-align:left;white-space:pre;overflow:visible;font-size:${this.getWordFontSize()}px !important;`;let tickTop=doc.createElement("span");tickTop.id="kookit-speed-reading-tick-top";let tickBottom=doc.createElement("span");tickBottom.id="kookit-speed-reading-tick-bottom";const textColor=this.getTextColor(doc),fontPx=this.getWordFontSize(),tickCss=`position:absolute;left:50%;transform:translateX(-50%);width:2px;height:${Math.round(.3*fontPx)}px;background:rgba(128,128,128,0.6);`;tickTop.style.cssText=tickCss+`top:-${Math.round(.45*fontPx)}px;`,tickBottom.style.cssText=tickCss+`bottom:-${Math.round(.45*fontPx)}px;`,wordArea.appendChild(left),wordArea.appendChild(pivot),wordArea.appendChild(right),wordArea.appendChild(tickTop),wordArea.appendChild(tickBottom),wordArea.style.cssText+=`font-size:${fontPx}px !important;`,wordArea.style.color=textColor;let status=doc.createElement("div");status.id="kookit-speed-reading-status",status.style.cssText="display:none;font-size:"+Math.round(.6*fontPx)+"px !important;opacity:0.7;",status.textContent="The End",status.style.color=textColor;let toggle=doc.createElement("div");toggle.id="kookit-speed-reading-toggle",toggle.style.cssText=`margin-top:${Math.round(.8*fontPx)}px;width:56px;height:56px;border-radius:50%;display:flex;align-items:center;justify-content:center;cursor:pointer;font-size:22px !important;border:1px solid rgba(128,128,128,0.5);color:${textColor};pointer-events:auto;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;`,toggle.appendChild(this.createToggleIcon(doc,this.playing)),overlay.appendChild(wordArea),overlay.appendChild(status),overlay.appendChild(toggle),doc.body.appendChild(overlay),toggle.addEventListener("click",event=>{event.stopPropagation(),this.toggle()}),overlay.addEventListener("click",event=>{event.stopPropagation(),this.toggle()});const blockEvent=event=>{event.stopPropagation()};overlay.addEventListener("touchstart",blockEvent,{passive:!1}),overlay.addEventListener("touchmove",blockEvent,{passive:!1}),overlay.addEventListener("touchend",blockEvent,{passive:!1}),overlay.addEventListener("wheel",blockEvent,{passive:!1}),overlay.addEventListener("mousedown",blockEvent,!1),overlay.addEventListener("dblclick",blockEvent,!1)}"scroll"===this.readerMode&&this.getElement()&&(overlay.style.top=convertStyleNum(this.getElement().scrollTop)+"px",overlay.style.height=this.getElement().clientHeight+"px")}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-speed-reading-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay),this.overlayEl=null,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null)}isOverlayValid(doc){return!(!this.overlayEl||doc.getElementById("kookit-speed-reading-overlay")!==this.overlayEl)}createToggleIcon(doc,playing){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","22"),svg.setAttribute("height","22"),svg.style.cssText="display:block;fill:currentColor;";const path=doc.createElementNS("http://www.w3.org/2000/svg","path");return path.setAttribute("d",playing?"M7 5h4v14H7zM13 5h4v14h-4z":"M9 5v14l11-7z"),svg.appendChild(path),svg}updateToggleIcon(){let doc=this.getDoc();if(!doc)return;let toggle=doc.getElementById("kookit-speed-reading-toggle");if(toggle){for(;toggle.firstChild;)toggle.removeChild(toggle.firstChild);toggle.appendChild(this.createToggleIcon(doc,this.playing))}}showEndState(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="none"),status&&(status.style.display="block")}showWordArea(){let doc=this.getDoc();if(!doc)return;let wordArea=doc.getElementById("kookit-speed-reading-word-area"),status=doc.getElementById("kookit-speed-reading-status");wordArea&&(wordArea.style.display="flex"),status&&(status.style.display="none")}renderWord(){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;pivot.style.setProperty("color","#ff3b30","important"),pivot.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,right.style.setProperty("color",this.getTextColor(doc),"important"),right.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`,left.style.setProperty("color",this.getTextColor(doc),"important"),left.style.cssText+=`font-size:${this.getWordFontSize()}px !important;`;let word=this.words[this.index]||"",chars=Array.from(word);if(0===chars.length)return left.textContent="",pivot.textContent="",right.textContent="",void this.showEndState();let orp=Math.min((word=>{const length=Array.from(word).length;return length<=3?0:length<=6?1:length<=9?2:length<=13?3:4})(word),chars.length-1);left.textContent=chars.slice(0,orp).join(""),pivot.textContent=chars[orp],right.textContent=chars.slice(orp+1).join("")}start(){if(!this.isSpeedReadingActive()||this.playing)return;if(this.getDoc()){if(this.playing=!0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length&&(this.words=this.extractWords(),this.index=0),0===this.words.length)return this.pause(),void this.showEndState();if(this.hasStartedOnce)return this.renderWord(),void this.scheduleNext();this.hasStartedOnce=!0,this.startCountdown()}}cancelCountdown(){this.countdownTimer&&(clearInterval(this.countdownTimer),this.countdownTimer=null)}startCountdown(){this.cancelCountdown();let count=3;this.renderCountdown(count),this.countdownTimer=setInterval(()=>{let currentDoc=this.getDoc();if(this.playing&¤tDoc&&this.isOverlayValid(currentDoc)){if(count--,count<=0)return this.cancelCountdown(),this.renderWord(),void this.scheduleNext();this.renderCountdown(count)}else this.cancelCountdown()},1e3)}renderCountdown(count){let doc=this.getDoc();if(!doc)return;this.updateOverlay(),this.showWordArea();let left=doc.getElementById("kookit-speed-reading-word-left"),pivot=doc.getElementById("kookit-speed-reading-word-pivot"),right=doc.getElementById("kookit-speed-reading-word-right");if(!left||!pivot||!right)return;const countdownPx=Math.round(1.6*this.getWordFontSize());left.textContent="",pivot.style.setProperty("color","#77A1D9","important"),pivot.style.cssText+=`font-size:${countdownPx}px !important;`,pivot.textContent=String(count),right.textContent=""}pause(){const hadCountdown=null!=this.countdownTimer;this.playing=!1,this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),hadCountdown&&this.renderWord(),this.updateToggleIcon()}toggle(){this.getDoc()&&(this.playing?this.pause():this.start())}scheduleNext(){if(this.cancelCountdown(),this.timer&&(clearTimeout(this.timer),this.timer=null),!this.playing)return;let doc=this.getDoc();if(!doc||!this.isOverlayValid(doc))return;const delay=((word,wpm)=>{const base=6e4/Math.max(1,wpm),token=word.trim(),length=Array.from(token).length;let factor=1;return length>=13?factor=1.8:length>=9?factor=1.5:length>=6&&(factor=1.2),token&&/^[.!?。!?;:…,,、()]$/.test(token)?factor=2.5:/[.!?。!?…]["'」』))]?$/.test(token)?factor=Math.max(factor,2):/[,,、;;:]["'」』))]?$/.test(token)&&(factor=Math.max(factor,1.5)),Math.round(base*factor)})(this.words[this.index]||"",this.speedReadingSpeed||300);this.timer=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){this.timer=null;let currentDoc=this.getDoc();this.playing&¤tDoc&&this.isOverlayValid(currentDoc)&&(yield this.showNextWord())}),delay)}showNextWord(){return __awaiter(this,void 0,void 0,function*(){if(this.playing)return this.index0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150));const afterKey=this.getPageKey();if(this.words=this.extractWords(),this.words.length>0){this.index=direction>0?0:this.words.length-1,this.updateOverlay(),this.renderWord();break}if(beforeKey===afterKey)return this.pause(),this.words=[],this.index=0,void this.showEndState();attempts++}}finally{this.skipFlip=!1}this.scheduleNext()}else this.pause()})}handleRendered(){if(!this.isSpeedReadingActive())return this.pause(),void this.removeOverlay();let doc=this.getDoc();if(doc&&doc.body){if(this.words=this.extractWords(),this.index=0,this.updateOverlay(),this.updateToggleIcon(),0===this.words.length)return this.showEndState(),this.cancelCountdown(),void(this.timer&&(clearTimeout(this.timer),this.timer=null));this.showWordArea(),this.renderWord(),this.autoStarted?this.playing&&(this.cancelCountdown(),this.scheduleNext()):(this.autoStarted=!0,this.start())}}}class ReadingRulerManager{constructor(config={}){this.isReadingRuler="no",this.readingRulerLineHeight=3,this.readingRulerBackgroundOpacity=.6,this.readerMode="single",this.index=0,this.column=0,this.skipFlip=!1,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getIsVertical=()=>!1,this.getOverlayBackground=()=>"#ffffff",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isReadingRuler=config.isReadingRuler||"no",this.readingRulerLineHeight=config.readingRulerLineHeight||3,this.readingRulerBackgroundOpacity=null!=config.readingRulerBackgroundOpacity?config.readingRulerBackgroundOpacity:.6,this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isReadingRuler&&(this.isReadingRuler=config.isReadingRuler),null!=config.readingRulerLineHeight&&(this.readingRulerLineHeight=config.readingRulerLineHeight),null!=config.readingRulerBackgroundOpacity&&(this.readingRulerBackgroundOpacity=config.readingRulerBackgroundOpacity)}isReadingRulerActive(){return"yes"===this.isReadingRuler}getStep(){return Math.max(1,Math.round(this.readingRulerLineHeight||3))}getVisibleBounds(){let iframe=this.getIframe(),top=0,bottom=iframe?iframe.clientHeight:0;if("scroll"===this.readerMode&&this.getElement()){const element=this.getElement();top=element.scrollTop,bottom=top+element.clientHeight}return{top:top,bottom:bottom}}getColumnBounds(){if("double"!==this.readerMode)return null;let iframe=this.getIframe();if(!iframe)return null;const width=iframe.clientWidth;if(!width)return null;let section=Math.floor(width/12),gap=section%2==0?section:section-1;const sectionWidth=Math.max(0,(width-gap)/2);return 0===this.column?{left:0,right:sectionWidth}:{left:Math.min(width,sectionWidth+gap),right:width}}getLines(columnBounds){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return[];if(this.getIsVertical())return[];const view=doc.defaultView||window,visible=this.getVisibleBounds(),visibleLeft=columnBounds?columnBounds.left:0,visibleRight=columnBounds?columnBounds.right:iframe.clientWidth,allRects=[],parentCache=new Map,walker=doc.createTreeWalker(doc.body,NodeFilter.SHOW_TEXT);let currentNode=walker.nextNode();for(;currentNode;){if((currentNode.textContent||"").trim()){const parent=currentNode.parentElement;if(parent){let parentVisible=parentCache.get(parent);if(void 0===parentVisible){const style=view.getComputedStyle(parent);parentVisible="none"!==style.display&&"hidden"!==style.visibility,parentCache.set(parent,parentVisible)}if(parentVisible){const range=doc.createRange();range.selectNodeContents(currentNode);const rects=range.getClientRects();for(let index=0;index=visible.bottom||rect.right<=visibleLeft||rect.left>=visibleRight||allRects.push({top:rect.top,bottom:rect.bottom,left:rect.left,right:rect.right}))}}}}currentNode=walker.nextNode()}allRects.sort((a,b)=>a.top-b.top||a.bottom-b.bottom);const lines=[];for(let index=0;index""!==item).map(item=>parseFloat(item));if(parts.length>=3&&parts.slice(0,3).every(item=>!isNaN(item)))return`rgba(${parts[0]},${parts[1]},${parts[2]},${alpha})`}const hex=base.trim().replace(/^#/,"");if(/^[0-9a-fA-F]{6}$/.test(hex)||/^[0-9a-fA-F]{3}$/.test(hex)){const full=3===hex.length?hex.split("").map(item=>item+item).join(""):hex;return`rgba(${parseInt(full.slice(0,2),16)},${parseInt(full.slice(2,4),16)},${parseInt(full.slice(4,6),16)},${alpha})`}return`rgba(0,0,0,${alpha})`}updateOverlay(animate,lines){let doc=this.getDoc(),iframe=this.getIframe();if(!doc||!doc.body||!iframe)return;if(!this.isReadingRulerActive())return void this.removeOverlay();let windowEl=doc.getElementById("kookit-reading-ruler-window"),columnBounds=this.getColumnBounds(),lineList=lines||this.getLines(columnBounds);if(0===lineList.length)return void this.removeOverlay();const step=this.getStep(),totalChunks=Math.ceil(lineList.length/step);this.index>=totalChunks&&(this.index=totalChunks-1),this.index<0&&(this.index=0);const startIndex=this.index*step,endIndex=Math.min(startIndex+step,lineList.length),visible=this.getVisibleBounds(),top=Math.max(visible.top,lineList[startIndex].top-4),bottom=Math.min(visible.bottom,lineList[endIndex-1].bottom+4),offset="yes"===this.isMobile?0:16,bounds=columnBounds||{left:0,right:iframe.clientWidth};let minLeft=lineList[startIndex].left,maxRight=lineList[startIndex].right;for(let index=startIndex+1;index=totalChunks&&(this.index=0),direction>0)if(this.index0)this.index--;else{if(!columnBounds||1!==this.column)return yield this.flipPage(-1),!0;this.column=0,this.index=Number.MAX_SAFE_INTEGER}return this.updateOverlay(!0,void 0),!0})}flipPage(direction){return __awaiter(this,void 0,void 0,function*(){this.skipFlip=!0;try{direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}this.index=direction>0?0:Number.MAX_SAFE_INTEGER,this.column=direction>0?0:"double"===this.readerMode?1:0;let doc=this.getDoc(),windowEl=doc?doc.getElementById("kookit-reading-ruler-window"):null;if(this.updateOverlay(!0,void 0),doc&&!windowEl){let newWindowEl=doc.getElementById("kookit-reading-ruler-window");if(newWindowEl){const fadeEl=newWindowEl;fadeEl.style.transition="none",fadeEl.style.opacity="0",fadeEl.style.transform="translateY(-20px)",fadeEl.offsetHeight,fadeEl.style.transition="opacity 0.3s ease, top 0.3s ease, height 0.3s ease, left 0.3s ease, width 0.3s ease",fadeEl.style.opacity="1",fadeEl.style.transform="translateY(0)",setTimeout(()=>{fadeEl.style.opacity="",fadeEl.style.transform="",fadeEl.style.transition=""},350)}}})}handleRendered(){this.isReadingRulerActive()&&!this.skipFlip&&(this.index=0,this.column=0,this.updateOverlay())}}class ParagraphModeManager{constructor(config={}){this.isParagraphMode="no",this.readerMode="single",this.index=0,this.sliceIndex=0,this.sliceCount=1,this.sliceStep=0,this.skipFlip=!1,this.currentParagraph=null,this.getDoc=()=>null,this.getElement=()=>({}),this.getIframe=()=>null,this.getOverlayBackground=()=>"#ffffff",this.getIsVertical=()=>!1,this.locateParagraph=()=>{},this.getChapterDocIndex=()=>"",this.nextPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.prevPage=()=>__awaiter(this,void 0,void 0,function*(){}),this.isParagraphMode=config.isParagraphMode||"no",this.readerMode=config.readerMode||"single",this.isMobile=config.isMobile}applyConfig(config={}){null!=config.isParagraphMode&&(this.isParagraphMode=config.isParagraphMode)}isParagraphModeActive(){return"yes"===this.isParagraphMode}getParagraphNodes(){let doc=this.getDoc(),element=this.getElement();if(!doc||!doc.body||!element)return[];let overlay=doc.getElementById("kookit-paragraph-overlay");return getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(el=>(!overlay||!overlay.contains(el))&&(el.textContent||"").trim()&&this.isParagraphVisible(el))}isParagraphVisible(el){var _a;const style=((null===(_a=el.ownerDocument)||void 0===_a?void 0:_a.defaultView)||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();return rect.width>0&&rect.height>0}isParagraphInViewport(doc,el){const style=(doc.defaultView||window).getComputedStyle(el);if("none"===style.display||"hidden"===style.visibility||"0"===style.opacity)return!1;const rect=el.getBoundingClientRect();if(!(rect.width>0&&rect.height>0))return!1;if("scroll"===this.readerMode){let element=this.getElement();return rect.bottom>element.scrollTop&&rect.top0&&rect.top0&&rect.left=list.length&&(this.index=list.length-1,this.sliceIndex=Number.MAX_SAFE_INTEGER),!overlay){overlay=doc.createElement("div"),overlay.id="kookit-paragraph-overlay",overlay.style.cssText="position:fixed;top:0;left:0;right:0;bottom:0;display:flex;align-items:center;justify-content:center;z-index:2147483000;pointer-events:none;text-align:center;transition:background-color 0.3s ease;margin:0 !important;padding:0 !important;";let content=doc.createElement("div");content.id="kookit-paragraph-overlay-content",content.style.cssText="width:calc(100% - 40px);max-width:600px;max-height:calc(100% - 180px);overflow:hidden;text-align:center;transition:background-color 0.3s ease;",overlay.appendChild(content),overlay.appendChild(this.createControls(doc)),doc.body.appendChild(overlay)}overlay.style.backgroundColor=this.getOverlayBackground(doc);let content=doc.getElementById("kookit-paragraph-overlay-content");if(!content)return;content.innerHTML="",content.style.height="";let inner=doc.createElement("div");inner.id="kookit-paragraph-overlay-inner",inner.style.cssText="width:100%;column-gap:40px;column-fill:auto;transition:transform 0.3s ease;",inner.appendChild(list[this.index].cloneNode(!0)),content.appendChild(inner),this.currentParagraph=list[this.index]||null,this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice(),inner.querySelectorAll("img").forEach(img=>{img.complete||img.addEventListener("load",()=>this.remeasureSlice(),{once:!0})}),this.refreshControls(doc)}remeasureSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");content&&inner&&inner.isConnected&&(this.measureSlice(content,inner),this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),this.showSlice())}measureSlice(content,inner){if(this.sliceCount=1,this.sliceStep=0,content.scrollHeight<=content.clientHeight+1)return;content.style.height="calc(100% - 180px)",inner.style.height="100%",inner.style.columnWidth=content.clientWidth+"px";inner.style.overflow="hidden";let extent=Math.max(content.scrollWidth,inner.scrollWidth);inner.style.overflow="";let step=content.clientWidth+40;this.sliceCount=Math.max(1,Math.round((extent+40)/step)),this.sliceStep=(extent+40)/this.sliceCount}showSlice(){let doc=this.getDoc();if(!doc)return;let content=doc.getElementById("kookit-paragraph-overlay-content"),inner=doc.getElementById("kookit-paragraph-overlay-inner");if(!content||!inner)return;let step=this.sliceStep||content.clientWidth+40;inner.style.transform=`translateX(${-this.sliceIndex*step}px)`}createControls(doc){let controls=doc.createElement("div");controls.id="kookit-paragraph-overlay-controls";let css="position:fixed;left:0;right:0;bottom:"+("yes"===this.isMobile?32:20)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;";if("scroll"===this.readerMode){let element=this.getElement();css="position:absolute;left:0;width:100%;top:"+(element?element.scrollTop+element.clientHeight-80:0)+"px;display:flex;justify-content:center;gap:48px;z-index:2147483001;pointer-events:none;"}controls.style.cssText=css;const btnCss="pointer-events:auto;width:44px;height:44px;padding:0;margin:0;background:transparent;border-radius:50%;border:1px solid rgba(128,128,128,1);color:rgba(128,128,128,1);display:flex;align-items:center;justify-content:center;cursor:pointer;user-select:none;-webkit-user-select:none;-webkit-tap-highlight-color:transparent;",bindButton=(btn,direction)=>{const handler=event=>{event.preventDefault(),event.stopPropagation(),this.handleChange(direction).catch(()=>{})};btn.addEventListener("touchend",handler,{passive:!1}),btn.addEventListener("mousedown",handler),btn.addEventListener("click",event=>{event.preventDefault(),event.stopPropagation()}),btn.addEventListener("dblclick",event=>event.stopPropagation()),btn.addEventListener("touchstart",event=>event.stopPropagation(),{passive:!1}),btn.addEventListener("touchmove",event=>event.stopPropagation(),{passive:!1})};let prevBtn=doc.createElement("button");prevBtn.id="kookit-paragraph-overlay-prev",prevBtn.style.cssText=btnCss,prevBtn.appendChild(this.createArrowIcon(doc,-1));let nextBtn=doc.createElement("button");return nextBtn.id="kookit-paragraph-overlay-next",nextBtn.style.cssText=btnCss,nextBtn.appendChild(this.createArrowIcon(doc,1)),bindButton(prevBtn,-1),bindButton(nextBtn,1),controls.appendChild(prevBtn),controls.appendChild(nextBtn),controls}createArrowIcon(doc,direction){const svg=doc.createElementNS("http://www.w3.org/2000/svg","svg");svg.setAttribute("viewBox","0 0 24 24"),svg.setAttribute("width","20"),svg.setAttribute("height","20"),svg.style.cssText="display:block;fill:none;stroke:currentColor;stroke-width:2;stroke-linecap:round;stroke-linejoin:round;";const line=doc.createElementNS("http://www.w3.org/2000/svg","path");line.setAttribute("d",direction<0?"M19 12H5":"M5 12h14");const head=doc.createElementNS("http://www.w3.org/2000/svg","path");return head.setAttribute("d",direction<0?"M12 19l-7-7 7-7":"M12 5l7 7-7 7"),svg.appendChild(line),svg.appendChild(head),svg}refreshControls(doc){let controls=doc.getElementById("kookit-paragraph-overlay-controls");if(!controls)return;let color="rgba(128,128,128,1)",prevBtn=doc.getElementById("kookit-paragraph-overlay-prev"),nextBtn=doc.getElementById("kookit-paragraph-overlay-next");if(prevBtn&&(prevBtn.style.color=color),nextBtn&&(nextBtn.style.color=color),"scroll"===this.readerMode){let element=this.getElement();element&&(controls.style.top=element.scrollTop+element.clientHeight-80+"px")}}removeOverlay(){let doc=this.getDoc();if(!doc)return;let overlay=doc.getElementById("kookit-paragraph-overlay");overlay&&overlay.parentNode&&overlay.parentNode.removeChild(overlay)}handleChange(direction){return __awaiter(this,void 0,void 0,function*(){let list=this.getParagraphNodes();if(0===list.length)return!1;if(direction>0){if(this.sliceIndex0)return this.sliceIndex--,this.showSlice(),!0;if(!(this.index>0))return yield this.flipChapter(-1),!0;this.index--,this.sliceIndex=Number.MAX_SAFE_INTEGER}return this.updateOverlay(list),this.locateParagraph(list[this.index]),!0})}flipChapter(direction){return __awaiter(this,void 0,void 0,function*(){let previousChapterDocIndex=this.getChapterDocIndex(),previousIndex=this.index,previousSliceIndex=this.sliceIndex;this.skipFlip=!0;try{let doc=this.getDoc();doc&&doc.body&&"scroll"!==this.readerMode&&(this.getIsVertical()?doc.body.scrollTo(0,direction>0?doc.body.scrollHeight:0):doc.body.scrollTo(direction>0?doc.body.scrollWidth:0,0)),direction>0?yield this.nextPage():yield this.prevPage(),yield new Promise(r=>setTimeout(r,"scroll"===this.readerMode?400:150))}finally{this.skipFlip=!1}let list=this.getParagraphNodes();if(this.getChapterDocIndex()===previousChapterDocIndex)return this.index=previousIndex,this.sliceIndex=previousSliceIndex,void this.updateOverlay(list);this.index=direction>0?0:Math.max(0,list.length-1),this.sliceIndex=direction>0?0:Number.MAX_SAFE_INTEGER,this.updateOverlay(list),list.length>0&&this.locateParagraph(list[this.index])})}handleRendered(){if(!this.isParagraphModeActive()||this.skipFlip)return;let list=this.getParagraphNodes();if(0===list.length)return this.index=0,this.sliceIndex=0,this.currentParagraph=null,void this.updateOverlay(list);if(this.currentParagraph&&this.currentParagraph.isConnected){let newIndex=list.indexOf(this.currentParagraph),doc=this.getDoc();if(newIndex>-1&&doc&&this.isParagraphInViewport(doc,this.currentParagraph))return this.index=newIndex,this.sliceIndex=Math.min(this.sliceIndex,this.sliceCount-1),void this.updateOverlay(list)}this.index=this.findFirstViewportParagraph(list),this.sliceIndex=0,this.updateOverlay(list)}}class GeneralRender extends EventEmitter{constructor(config){super(),this.animation="none",this.isBionic="no",this.isParagraphMode="no",this.isReadingRuler="no",this.isSpeedReading="no",this.isShowTotalPage="no",this.chapterSizeCache=null,this.estimatedSizePerPage=null,this.speedReadingSpeed=300,this.platform="web",this.isAllowScript="no",this.fullTranslationMode="no",this.addPageAnimation=backgroundColor=>{if("mimical"!==this.animation)return;if(this.isPageAnimationDisabled())return;const progress=this.getChapterProgress();if(!(null==progress?void 0:progress.totalPage))return;const pageAnimation=addPageAnimation(progress.totalPage,this.isDarkMode,backgroundColor||this.backgroundColor,Math.max(0,Math.floor(progress.currentPage||1)-1));pageAnimation&&(this.flipToNextPage=pageAnimation.flipToNextPage,this.flipToPrevPage=pageAnimation.flipToPrevPage,this.mouseDownHandler=pageAnimation.mouseDownHandler,this.mouseUpHandler=pageAnimation.mouseUpHandler,this.mouseMoveHandler=pageAnimation.mouseMoveHandler)},"yes"!==config.isParagraphMode&&"yes"!==config.isSpeedReading&&"yes"!==config.isReadingRuler||"scroll"===config.readerMode&&(config.readerMode="single"),this.readerMode=config.readerMode,window.readerMode=config.readerMode,this.animation=config.animation||"none",this.format=config.format,this.convertChinese=config.convertChinese,window.convertChinese=config.convertChinese,this.isIndent=config.isIndent,window.isIndent=config.isIndent,this.isHyphenation=config.isHyphenation||"no",window.isHyphenation=this.isHyphenation,this.isDarkMode=config.isDarkMode,this.isMobile=config.isMobile,this.backgroundColor=config.backgroundColor||"",this.textOrientation=config.textOrientation,window.textOrientation=config.textOrientation,this.isShowTotalPage=config.isShowTotalPage||"no",this.chapterList=[],this.chapterDocList=[],this.flattenChapters=[],this.book="",this.element="",this.tempLocation={},this.isBionic=config.isBionic||"no",this.isReadingRuler=config.isReadingRuler||"no",this.isParagraphMode=config.isParagraphMode||"no",this.isSpeedReading=config.isSpeedReading||"no",this.speedReadingSpeed=config.speedReadingSpeed||300,this.platform=config.platform||"web",window.platform=this.platform,window.isBionic=this.isBionic,this.transMap={},window.transMap=this.transMap,this.fullTranslationMode=config.fullTranslationMode||"no",window.fullTranslationMode=this.fullTranslationMode,this.bookLayout=config.bookLayout||"",window.bookLayout=this.bookLayout,this.codeHighlight=config.codeHighlight||"",window.codeHighlight=this.codeHighlight,this.textRules=config.textRules||[],window.textRules=this.textRules,this.isAllowScript="PDF"===this.format||"yes"===this.isMobile?"yes":config.isAllowScript||"no",this.flipToNextPage=()=>{},this.flipToPrevPage=()=>{},this.readingRulerManager=new ReadingRulerManager({isReadingRuler:this.isReadingRuler,readingRulerLineHeight:config.readingRulerLineHeight,readingRulerBackgroundOpacity:config.readingRulerBackgroundOpacity,readerMode:this.readerMode,isMobile:this.isMobile}),this.readingRulerManager.getDoc=()=>this.getDocument(),this.readingRulerManager.getElement=()=>this.element,this.readingRulerManager.getIframe=()=>this.getIframe(),this.readingRulerManager.getIsVertical=()=>this.isVertical(),this.readingRulerManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.readingRulerManager.nextPage=()=>this.next(),this.readingRulerManager.prevPage=()=>this.prev(),this.speedReadingManager=new SpeedReadingManager({isSpeedReading:this.isSpeedReading,speedReadingSpeed:this.speedReadingSpeed,isDarkMode:this.isDarkMode,readerMode:this.readerMode}),this.speedReadingManager.getDoc=()=>this.getDocument(),this.speedReadingManager.getElement=()=>this.element,this.speedReadingManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.speedReadingManager.getProgress=()=>this.getProgress(),this.speedReadingManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex,this.speedReadingManager.nextPage=()=>this.next(),this.speedReadingManager.prevPage=()=>this.prev(),this.paragraphModeManager=new ParagraphModeManager({isParagraphMode:this.isParagraphMode,readerMode:this.readerMode,isMobile:this.isMobile}),this.paragraphModeManager.getDoc=()=>this.getDocument(),this.paragraphModeManager.getElement=()=>this.element,this.paragraphModeManager.getIframe=()=>this.getIframe(),this.paragraphModeManager.getOverlayBackground=doc=>this.getParagraphOverlayBackground(doc),this.paragraphModeManager.getIsVertical=()=>this.isVertical(),this.paragraphModeManager.getChapterDocIndex=()=>this.tempLocation.chapterDocIndex||"",this.paragraphModeManager.locateParagraph=el=>this.locateParagraph(el),this.paragraphModeManager.nextPage=()=>this.next(),this.paragraphModeManager.prevPage=()=>this.prev(),this.on("rendered",()=>{if(this.paragraphModeManager.handleRendered(),this.readingRulerManager.handleRendered(),this.speedReadingManager.skipFlip||this.speedReadingManager.handleRendered(),null===this.estimatedSizePerPage){const value=this.computeEstimatedSizePerPage();value>1&&(this.estimatedSizePerPage=value)}}),this.mouseDownHandler=()=>{},this.mouseUpHandler=()=>{},this.mouseMoveHandler=event=>{},this.touchEventSet={},"yes"===this.isMobile&&(console.log=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.info=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))},console.error=function(...args){window.ReactNativeWebView.postMessage(args.map(arg=>String(arg)).join(", "))})}isVertical(){return"vertical"===this.textOrientation&&"scroll"!==this.readerMode}getPageSize(){let scale="double"===this.readerMode?2:1,iframe=this.getIframe();if(!iframe)return;let iframeHeight=null==iframe?void 0:iframe.getBoundingClientRect().height;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:this.element.clientWidth,sectionHeight:(this.element.clientHeight-gap)/scale,gap:gap}}let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;return{width:this.element.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(this.element.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}scrollToText(text){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let audioNodes=getBlockElement(doc.body).filter(item=>!isParentBlock(item)).filter(s=>(s.textContent||"").indexOf(text)>-1);if(audioNodes.length>0){let targetNode=audioNodes[0],left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top)}"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("scroll-text")})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){if("scroll"===this.readerMode){targetPage<0&&(targetPage=1);let top=(targetPage-1)*(this.element.clientHeight-50);this.element.scrollTo(0,top)}else{let doc=this.getDocument();if(!doc)return;if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientHeight+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollTop=targetPage*scrollDistance;doc.body.scrollTo({left:0,top:targetScrollTop,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;const scrollDistance=this.element.clientWidth+gap;"double"===this.readerMode?targetPage=(targetPage%2==0?targetPage-2:targetPage-1)/2:targetPage-=1,targetPage<0&&(targetPage=0);const targetScrollLeft=targetPage*scrollDistance;doc.body.scrollTo({top:0,left:targetScrollLeft,behavior:"sliding"===this.animation&&"yes"!==this.isMobile?"smooth":"auto"})}}yield this.record()})}resolveChapter(href){let path=href;path=path.replace(/^#/,"").replace(/^\.\//,"").replace(/^\//,""),path.startsWith("../")&&(path=path.replace(/^\.\.\//,""));let chapterIndex=-1;0===this.flattenChapters.length&&this.flatChapter(this.chapterList);for(let index=0;index-1){let chapter=this.flattenChapters[chapterIndex];return href.startsWith("kindle")?this.chapterDocList[chapter.index].href===href?chapter:null:chapter}for(let index=0;index-1){let chapterDoc=this.chapterDocList[chapterIndex];return{label:chapterDoc.label||"",href:chapterDoc.href,index:chapterIndex}}for(let index=0;index-1?{label:this.chapterDocList[chapterIndex].label||"",href:this.chapterDocList[chapterIndex].href,index:chapterIndex}:null}flatChapter(chapters){let newChapter=[];for(let i=0;i0?(newChapter.push(chapters[i]),newChapter=newChapter.concat(this.flatChapter(chapters[i].subitems))):newChapter.push(chapters[i]);return this.flattenChapters=newChapter,newChapter}getChapter(){return this.chapterList}getChapterDoc(){return this.chapterDocList}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0){if(1===this.flattenChapters.length){let progressInfo=this.getChapterProgress();if(!progressInfo)return;let pageNumber=Math.floor(progressInfo.totalPage*percentage);return void(yield this.goToPage(pageNumber))}let chapterIndex=1===percentage?this.flattenChapters.length-1:Math.floor(this.flattenChapters.length*percentage);yield this.goToChapter(this.flattenChapters[chapterIndex].index.toString(),this.flattenChapters[chapterIndex].href,this.flattenChapters[chapterIndex].label)}})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){0===this.flattenChapters.length&&this.flatChapter(this.chapterList),this.flattenChapters.length>0&&(yield this.goToChapter(this.flattenChapters[targetChapterIndex].index,this.flattenChapters[targetChapterIndex].href,this.flattenChapters[targetChapterIndex].label))})}goToChapterDocIndex(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label))})}goToChapter(chapterDocIndex,chapterHref,chapterTitle){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),chapterHref&&chapterHref.startsWith("kindle")){let result=yield this.book.resolveHref(chapterHref);if(result.anchor){let node=result.anchor(doc);node&&(yield this.goToNode(node))}}chapterHref&&chapterHref.indexOf("#")>-1&&(yield handleScrollPosition(this.element,this.readerMode,"","",chapterHref,"",doc)),yield this.record(),this.trigger("rendered"),this.addPageAnimation()}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{text:text,chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref,count:count,page:page,cfi:cfi}=bookLocation;if(yield handleRenderChapter(parseInt(chapterDocIndex),chapterTitle,chapterHref,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,iframe),cfi){const cfiInfo=new CFI(cfi,{});let doc=this.getDocument();if(!doc)return;const{node:node,offset:offset}=cfiInfo.resolve(doc,{});if(node){let element=null,currentNode=node;for(;currentNode;){const temp=currentNode;if(temp.tagName&&"h1,h2,h3,h4,h5,h6,p,div,ul,dl,ol,pre,li,dt,dd,blockquote,address,kookitmarker".indexOf(temp.tagName.toLowerCase())>-1){element=temp;break}currentNode=currentNode.parentNode}element&&(count="ignore",text=element.textContent)}}yield handleScrollPosition(this.element,this.readerMode,text,count,"",page,doc),rangy.init(),yield this.record(),this.trigger("rendered"),this.addPageAnimation()})}getDocument(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc||null}getIframe(){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];return iframe||null}goToNode(node){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(!node)return;let targetNode=getCloestBlock(node,this.element,this.readerMode),left=targetNode?getActualOffsetLeft(targetNode)-convertStyleNum(targetNode.marginLeft||parseFloat(getComputedStyle(targetNode).marginLeft)):0,top=targetNode?getActualOffsetTop(targetNode)-convertStyleNum(targetNode.marginTop||parseFloat(getComputedStyle(targetNode).marginTop)):0;"scroll"!==this.readerMode?this.isVertical()?doc.body.scrollTo(0,top):doc.body.scrollTo(left,0):this.element.scrollTo(0,top),yield this.record(),this.trigger("rendered")})}goToXpath(xpath){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let chapterDocIndexMatch=xpath.match(/\/body\/DocFragment\[(\d+)\]/),chapterDocIndex=chapterDocIndexMatch?parseInt(chapterDocIndexMatch[1]||"1")-1:0,chapterDoc=this.chapterDocList[chapterDocIndex];if(yield handleRenderChapter(chapterDocIndex,chapterDoc.label||"",chapterDoc.href,this.chapterDocList,this.element,this.readerMode,this.format,this.tempLocation,doc,this.getIframe()),doc=this.getDocument(),!doc)return;let newXpath=xpath.replace(/\/body\/DocFragment\[\d+\]/,"");newXpath=newXpath.split("/text()")[0];const node=((xpath,doc)=>{if(!xpath||!doc||!doc.body)return null;try{let path=xpath;if(path.startsWith("/body/"))path=path.slice(6);else if(path.startsWith("/body"))return doc.body;const segments=path.split("/").filter(Boolean);let current=doc.body;for(const seg of segments){const match=seg.match(/^([a-zA-Z0-9]+)(?:\[(\d+)\])?$/);if(!match)return null;const tag=match[1].toLowerCase(),idx=match[2]?parseInt(match[2])-1:0,children=Array.from(current.children).filter(c=>c.tagName.toLowerCase()===tag);if(!children[idx])return null;current=children[idx]}return current}catch(_a){return null}})(newXpath,doc);yield this.goToNode(node),rangy.init(),yield this.record(),this.trigger("rendered")})}removeContent(){this.element.innerHTML=""}getParagraphOverlayBackground(doc){let color=(doc.defaultView||window).getComputedStyle(doc.body).backgroundColor;return color&&"transparent"!==color&&"rgba(0,0,0,0)"!==color.replace(/\s/g,"")||(color=this.backgroundColor),color||"#ffffff"}locateParagraph(el){let doc=this.getDocument();if(!doc||!doc.body||!el)return;let left=getActualOffsetLeft(el),top=getActualOffsetTop(el);if("scroll"!==this.readerMode)if(this.isVertical()){let section=Math.floor(this.element.clientHeight/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientHeight+gap;doc.body.scrollTo(0,Math.max(0,Math.round(top/scrollDistance))*scrollDistance)}else{let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1,scrollDistance=this.element.clientWidth+gap;doc.body.scrollTo(Math.max(0,Math.round(left/scrollDistance))*scrollDistance,0)}else this.element.scrollTo(0,top);this.record()}prev(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(-1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(-1))return}if("scroll"===this.readerMode&&0===convertStyleNum(this.element.scrollTop)||this.isVertical()&&0===convertStyleNum(doc.body.scrollTop)||"scroll"!==this.readerMode&&!this.isVertical()&&0===convertStyleNum(doc.body.scrollLeft)){if("0"===this.tempLocation.chapterDocIndex)return;yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),parseInt(this.tempLocation.chapterDocIndex||"-1")>-1&&("scroll"===this.readerMode?this.element.scrollTo(0,doc.body.scrollHeight):this.isVertical()?doc.body.scrollTo(0,doc.body.scrollHeight):doc.body.scrollTo(doc.body.scrollWidth,0)),this.trigger("rendered")}else"scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile);yield this.record()}})}next(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe&&("yes"!==this.isSpeedReading||this.speedReadingManager.skipFlip)){if("yes"===this.isReadingRuler&&!this.readingRulerManager.skipFlip){if(yield this.readingRulerManager.handleChange(1))return}if("yes"===this.isParagraphMode&&!this.paragraphModeManager.skipFlip){if(yield this.paragraphModeManager.handleChange(1))return}if(this.isVertical()&&Math.abs(doc.body.scrollHeight-convertStyleNum(doc.body.scrollTop)-doc.body.clientHeight)<50||Math.abs(doc.body.scrollWidth-convertStyleNum(doc.body.scrollLeft)-doc.body.clientWidth)<50&&"scroll"!==this.readerMode&&!this.isVertical()||Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)<20&&"scroll"===this.readerMode)return yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),void this.trigger("rendered");"scroll"===this.readerMode?Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)-(this.element.clientHeight-50)<20&&Math.abs(this.element.scrollHeight-convertStyleNum(this.element.scrollTop)-this.element.clientHeight)>20?this.element.scrollTo({left:0,top:this.element.scrollHeight-20,behavior:"smooth"}):this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.record()}})}slideTo(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;if(this.isPageAnimationDisabled())return void("left"===direction?yield this.prev():"right"===direction&&(yield this.next()));let section=Math.floor(this.element.clientWidth/12),gap=section%2==0?section:section-1;slideAnimateTo(direction,this.format,doc,doc,this.element,this,gap)})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handlePrevChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield handleNextChapter(this.element,this.flatChapter(this.chapterList),this.chapterDocList,this.readerMode,this.format,this.tempLocation,doc,iframe),yield this.record(),this.trigger("rendered"))})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?getVisibleText(this.element,this.readerMode,doc):""})}audioText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc?yield getAudioText(this.element,this.readerMode,doc,!1):[]})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;i!!s)})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();return doc&&doc.body.textContent||""})}getImageList(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("PDF"===this.format)return[];let urls;if(null==chapterDocIndex){const doc=this.getDocument();if(!doc)return[];urls=collectChapterImageUrls(doc.body)}else{if(chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[];const chapterText=yield handleOneChapterDoc(this.chapterDocList[chapterDocIndex].text,!1);if(!chapterText)return[];const chapterDoc=(new DOMParser).parseFromString(chapterText,"text/html");urls=collectChapterImageUrls(chapterDoc.body)}return"yes"!==this.isMobile?urls:Promise.all(urls.map(url=>__awaiter(this,void 0,void 0,function*(){if(!url.startsWith("blob:"))return url;try{return yield blobUrlToBase64(url)}catch(_a){return url}})))})}autoScroll(rate,isStart){if(!this.getDocument())return;if(this.scrollTimer&&(cancelAnimationFrame(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,frameCount=0;const scrollStep=()=>{if(accumulatedScroll+=rate,frameCount++,Math.abs(rate)<1){if((Math.abs(accumulatedScroll)>=.5||frameCount%Math.max(1,Math.floor(30/Math.abs(rate)))===0)&&Math.abs(accumulatedScroll)>=.1){const scrollAmount=Math.round(10*accumulatedScroll)/10;this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll=0,frameCount=0}}else if(Math.abs(accumulatedScroll)>=1){const scrollAmount=Math.floor(accumulatedScroll);this.element.scrollBy({left:0,top:scrollAmount,behavior:"auto"}),accumulatedScroll-=scrollAmount}this.scrollTimer=requestAnimationFrame(scrollStep)};this.scrollTimer=requestAnimationFrame(scrollStep),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}autoScrollIOS(rate,isStart){let doc=this.getDocument();if(!doc)return;if(this.scrollTimer&&(clearInterval(this.scrollTimer),this.scrollTimer=null),this.recordTimer&&(clearInterval(this.recordTimer),this.recordTimer=null),"no"===isStart||"scroll"!==this.readerMode)return;let accumulatedScroll=0,realScrollTop=this.element.scrollTop;this.scrollTimer=setInterval(()=>{accumulatedScroll+=rate,doc&&(doc.body.style.transform=`translateY(-${accumulatedScroll}px)`,Math.abs(accumulatedScroll)>=50&&(doc.body.style.transform="translateY(0px)",realScrollTop+=accumulatedScroll,this.element.scrollTo({left:0,top:realScrollTop,behavior:"auto"}),accumulatedScroll=0))},30),this.recordTimer=setInterval(()=>{"scroll"===this.readerMode&&Math.abs(this.element.scrollHeight-this.element.scrollTop-this.element.clientHeight)<10&&this.nextChapter(),this.record()},3e3)}highlightSearchNode(text,style){let doc=this.getDocument();doc&&handleHighlightSearchNode(text,style,doc)}highlightAudioNode(text,style){let doc=this.getDocument();doc&&((text,style,doc)=>{if(doc.querySelectorAll('span[data-highlight="true"]').forEach(highlight=>{const parent=highlight.parentNode;parent&&parent.replaceChild(doc.createTextNode(highlight.textContent||""),highlight)}),!text.trim())return;let nodes=getBlockElement(doc.body).filter(node=>{const content=node.textContent||"";return content.trim()&&content.indexOf(text)>-1});if(nodes.length>0){const processNode=node=>{var _a;if(node.nodeType===Node.TEXT_NODE){const content=node.textContent||"",index=content.indexOf(text);if(index>-1){const before=content.substring(0,index),after=content.substring(index+text.length),highlightSpan=doc.createElement("span");highlightSpan.setAttribute("style",style),highlightSpan.setAttribute("data-highlight","true"),highlightSpan.textContent=text,highlightSpan.setAttribute("class","kookit-highlight-text");const fragment=doc.createDocumentFragment();return before&&fragment.appendChild(doc.createTextNode(before)),fragment.appendChild(highlightSpan),after&&fragment.appendChild(doc.createTextNode(after)),null===(_a=node.parentNode)||void 0===_a||_a.replaceChild(fragment,node),!0}}return!1},walkAndProcess=node=>{if(processNode(node))return!0;const childNodes=Array.from(node.childNodes);for(const child of childNodes)if(walkAndProcess(child))return!0;return!1};walkAndProcess(nodes[0])}})(text,style,doc,this.element,this.readerMode)}doSearch(keyword){return __awaiter(this,void 0,void 0,function*(){return"PDF"===this.format?yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){let searchResult=[];for(let i=0;i{const y=item.transform[5];let foundLineKey=null;for(const[firstItemIndex,items]of lineMap.entries()){const firstItemY=items[0].transform[5];if(Math.abs(y-firstItemY){items.sort((a,b)=>a.transform[4]-b.transform[4]);const lineText=items.map(item=>item.str).join("").toLowerCase();lineText.indexOf(keyword.toLowerCase())>-1&&searchResult.push({excerpt:lineText,cfi:JSON.stringify({text:lineText+"#"+i+"#"+itemKey,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})})}return searchResult}))(keyword,this.chapterDocList):yield((keyword,chapterDocList)=>__awaiter(void 0,void 0,void 0,function*(){var _d,_e;let searchResult=[];for(let i=0;i!isParentBlock(item));for(let j=0;j-1&&searchResult.push({excerpt:(null===(_e=nodeList[j].textContent)||void 0===_e?void 0:_e.substring(keyWordIndex-100,keyWordIndex+100))||"",cfi:JSON.stringify({text:nodeList[j].textContent,chapterTitle:chapterDocList[i].label,chapterDocIndex:i,chapterHref:chapterDocList[i].href,count:"search",percentage:i/chapterDocList.length,keyword:keyword})})}}return searchResult}))(keyword,this.chapterDocList)})}getChapterSizes(){if(this.chapterSizeCache)return this.chapterSizeCache;if(!this.estimatedSizePerPage)return{sizes:[],total:0,pages:[]};const sizes=this.chapterDocList.map(item=>(null==item?void 0:item.text)&&(item.text.size||item.text.length)||1);var arr;const pages=(arr=sizes).map((num,index)=>arr.slice(0,index).reduce((acc,cur)=>acc+cur,0)).map(size=>Math.round(size/this.getEstimatedSizePerPage())*("double"===this.readerMode?2:1)+1),total=sizes.reduce((a,b)=>a+b,0);return this.chapterSizeCache={sizes:sizes,total:total,pages:pages},this.trigger("chapter-pages"),this.chapterSizeCache}getEstimatedSizePerPage(){return null!==this.estimatedSizePerPage?this.estimatedSizePerPage:this.computeEstimatedSizePerPage()}computeEstimatedSizePerPage(){const doc=this.getDocument();if(!doc||!doc.body)return 1;if("CACHE"===this.format)return 1;const bytesPerChar=GeneralRender.SIZE_PER_CHAR[(this.format||"").toUpperCase()]||3,vertical=isVerticalLayout()&&"scroll"!==this.readerMode;let inlinePx=0,blockPx=0;if("scroll"===this.readerMode?(inlinePx=this.element.clientWidth,blockPx=this.element.clientHeight-50):vertical?(inlinePx=doc.body.clientHeight,blockPx=doc.body.clientWidth):(inlinePx=doc.body.clientWidth,blockPx=doc.body.clientHeight),inlinePx<=0||blockPx<=0)return 1;const view=doc.defaultView||window,bodyStyle=view.getComputedStyle(doc.body),sampleEl=doc.body.querySelector("div,p:not(.hide),li,blockquote,dd,dt,pre,td");if(!sampleEl)return 1;const style=view.getComputedStyle(sampleEl),fontSize=parseFloat(style.fontSize)||parseFloat(bodyStyle.fontSize)||18;let lineHeightPx=parseFloat(style.lineHeight);lineHeightPx&&"normal"!==style.lineHeight||(lineHeightPx=1.25*fontSize);const letterSpacing=parseFloat(style.letterSpacing)||0,marginBlock=(parseFloat(style.marginTop)||0)+(parseFloat(style.marginBottom)||0),charAdvancePx=Math.max(fontSize+letterSpacing,1),charsPerLine=Math.max(Math.floor(inlinePx/charAdvancePx),1),effectiveLineHeight=lineHeightPx+marginBlock/3,charsPerPage=Math.max(Math.floor(blockPx/effectiveLineHeight)*charsPerLine,1),value=Math.max(charsPerPage*bytesPerChar,1);return"double"===this.readerMode?value/2:value}getChapterProgress(){let doc=this.getDocument();return doc?Object.assign(Object.assign({},progressInfo(this.readerMode,doc,this.element)),{percentage:this.tempLocation.percentage}):null}getProgress(){const chapterProgress=this.getChapterProgress();if(!chapterProgress)return;if(this.getChapterSizes(),"yes"!==this.isShowTotalPage)return Object.assign({},chapterProgress);if(!this.estimatedSizePerPage)return Object.assign({},chapterProgress);let sizePerPage=this.getEstimatedSizePerPage();if(1===sizePerPage)return Object.assign({},chapterProgress);const{total:total}=this.getChapterSizes(),totalPage=Math.max(Math.round(total/sizePerPage),chapterProgress.totalPage),currentPage=Math.round(totalPage*parseFloat(chapterProgress.percentage||"0"))+1;return{totalPage:totalPage*("double"===this.readerMode?2:1),currentPage:currentPage,percentage:chapterProgress.percentage}}getPages(){if(this.chapterSizeCache){const{pages:pages}=this.chapterSizeCache;return pages}return[]}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,null),this.trigger("page-changed"))})}getPosition(){return this.tempLocation}getBatchTransTexts(){return __awaiter(this,void 0,void 0,function*(){let restTexts=yield this.audioText();restTexts=restTexts.slice(0,200);let totalLength=0;return restTexts=restTexts.filter(item=>(totalLength+=item.length,totalLength<=1e4)),restTexts=restTexts.filter(item=>!this.transMap[item]||!this.transMap[item].text),restTexts.filter(item=>item.trim().length>0)})}getNotePosition(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);return selectedElement?(yield handleRecord(this.element,this.readerMode,this.flatChapter(this.chapterList),this.chapterDocList,this.tempLocation,doc,selectedElement),this.tempLocation):void 0})}setStyle(css){let doc=this.getDocument();if(!doc)return;let existingStyle=doc.head.querySelector("style#kookit-default-style");if(existingStyle)existingStyle.innerHTML=css;else{var defaultStyle=document.createElement("style");defaultStyle.id="kookit-default-style",defaultStyle.innerHTML=css,doc.head.appendChild(defaultStyle)}}getHighlightCoords(){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe)return rangy.getSelection(iframe).saveCharacterRanges(doc.body)[0]})}renderHighlighters(notes,handleNoteClick){return __awaiter(this,void 0,void 0,function*(){notes=notes.reverse();let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearHighlight(doc);const batchItems=notes.map(item=>({range:JSON.parse(item.range),colorCode:item.color,noteKey:item.key,isNote:""!==item.notes,noteContent:item.notes||""}));try{yield showNoteHighlightBatch(batchItems,handleNoteClick,doc,iframe,"yes"===this.isMobile)}catch(e){console.error(e,"Exception has been caught when restore character ranges.")}})}removeOneNote(key,chapterDocIndex){var _a;let doc=this.getDocument();if(!doc)return;const icons=doc.querySelectorAll(".kookit-note-icon[data-key='"+key+"']");for(let index=0;index{var _a,_b;let iWin=iframe.contentWindow||(null===(_a=iframe.contentDocument)||void 0===_a?void 0:_a.defaultView),temp=range;temp=[temp];let selection=rangy.getSelection(iframe);selection.restoreCharacterRanges(doc,temp);let newRange=selection.getRangeAt(0);highlightRange(newRange,colorCode,noteKey,handleNoteClick,doc,isNote,isMobile,noteContent),iWin&&iWin.getSelection()&&(null===(_b=iWin.getSelection())||void 0===_b||_b.empty())})(JSON.parse(item.range),item.color,item.key,handleNoteClick,doc,iframe,""!==item.notes,"yes"===this.isMobile,item.notes||"")})}isPageAnimationDisabled(){return"yes"===this.isMobile&&("yes"===this.isParagraphMode||"yes"===this.isReadingRuler||"yes"===this.isSpeedReading)}displayFontBase64(fontName,fontBase64,fontFormat,fontType){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontBase64.length)return;const font=new FontFace(fontName,`url(data:font/${fontType};charset=utf-8;base64,${fontBase64})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('data:font/"+fontType+";charset=utf-8;base64,"+fontBase64+"') format('"+fontFormat+"');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}displayFontUrl(fontName,fontUrl){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc||0===fontUrl.length)return;const font=new FontFace(fontName,`url(${fontUrl})`);let loadedFont=yield font.load();document.fonts.add(loadedFont);const fontFaceCSS="@font-face { font-family: '"+fontName+"'; src: url('"+fontUrl+"') format('truetype');}",styleElement=document.createElement("style");styleElement.type="text/css",styleElement.appendChild(document.createTextNode(fontFaceCSS)),doc.head.appendChild(styleElement)})}getAllDocuments(){var _a;let doc=this.getDocument();if(!doc)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[doc];let iframes=doc.querySelectorAll("iframe"),documents=[];return iframes.forEach(iframe=>{let iframeDoc=iframe.contentDocument;iframeDoc&&documents.push(iframeDoc)}),[doc,...documents]}getAllIframes(){var _a;let iframe=this.getIframe();if(!iframe)return[];if("PDF"!==this.format&&!(null===(_a=this.format)||void 0===_a?void 0:_a.startsWith("CB")))return[iframe];let doc=this.getDocument();if(!doc)return[];let iframes=doc.querySelectorAll("iframe"),iframeElements=[];return iframes.forEach(iframe=>{let iframeElement=iframe;iframeElements.push(iframeElement)}),[iframe,...iframeElements]}addTouchEvent(isAndroid,touchControlRule){let docs=this.getAllDocuments(),iframes=this.getAllIframes();const animation=this.isPageAnimationDisabled()?"none":this.animation;for(let index=0;index-1)){let chapterInfo=this.resolveChapter(href);if(chapterInfo)return yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0};let result=yield this.book.resolveHref(href),chapterDocIndex=this.tempLocation.chapterDocIndex;if(result.index===parseInt(chapterDocIndex)){let element=result.anchor(doc);if(!element)return{handled:!1};let id=element.getAttribute("id")||"";result=Object.assign(Object.assign({},result),{id:id})}if(!result.anchor)return{handled:!1};let currentPosition=this.getPosition();if(result.index!==parseInt(currentPosition.chapterDocIndex)){if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[result.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text(),node=result.anchor((new DOMParser).parseFromString(chapterText,"text/html"));return node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}return{handled:!0}}{let node=result.anchor(doc);node&&(href="#"+node.getAttribute("id"))}}if(href&&-1===href.indexOf("../")&&(0===href.indexOf("http")||0===href.indexOf("mailto"))&&-1===href.indexOf("OEBPF")&&-1===href.indexOf("OEBPS")&&-1===href.indexOf("footnote")&&-1===href.indexOf("blob")&&-1===href.indexOf("data:application"))return{handled:!0,href:href,external:!0};if(href&&this.resolveChapter(href)){let chapterInfo=this.resolveChapter(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}if(href&&href.indexOf("#")>-1){let id=href.split("#").reverse()[0],node=doc.body.querySelector("#"+CSS.escape(id));event.target.getBoundingClientRect();let isJump=!1;if(!node||event.target===node||node.contains(event.target)){if(0!==href.indexOf("#")){for(;href.startsWith(".");)href=href.substring(1);let chapterInfo=this.resolveChapter(href.split("#")[0]);if(!chapterInfo)return{handled:!1};if(isElementFootnote(event.target)){let blob=yield fetch(yield this.chapterDocList[chapterInfo.index].text.load()).then(r=>r.blob()),chapterText=yield blob.text();return node=(new DOMParser).parseFromString(chapterText,"text/html").body.querySelector("#"+CSS.escape(id)),node?{handled:!0,isShowMenu:!0,isJump:!1,href:"",node:node}:{handled:!1}}yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label)}if(node=doc.body.querySelector("#"+CSS.escape(id)),!node)return{handled:!1};isJump=!0,yield this.goToNode(node)}return isElementFootnote(event.target)?{handled:!0,isShowMenu:!0,isJump:isJump,href:href,node:node}:{handled:!0}}if(href&&this.book.resolveHref&&this.book.resolveHref(href)){let chapterInfo=yield this.book.resolveHref(href);return chapterInfo?(yield this.goToChapter(chapterInfo.index,chapterInfo.href,chapterInfo.label),{handled:!0,redirectChapter:!0}):{handled:!1}}return{handled:!1}})}getFootnoteContent(node){return __awaiter(this,void 0,void 0,function*(){if(isElementFootnote(node)||!node.textContent.trim()||"A"===node.tagName){let next=node.nextSibling,content=node.textContent;for(;next&&(next.tagName!==node.tagName||!content.trim());)content+=next.textContent,next=next.nextSibling;if(!content.trim()||isContentFootnote(content)){let candidate=node.parentNode;for(;candidate&&"BODY"!==candidate.tagName;){const candidateText=candidate.textContent||"";if(candidateText.trim()&&!isContentFootnote(candidateText))break;candidate=candidate.parentNode}if(!candidate)return{handled:!1};node=candidate}else content.trim()&&content.trim().length<=3e3&&((node=document.createElement("div")).innerHTML=content)}let htmlContent=node.innerHTML;return node.textContent.trim()?node.textContent.trim()&&node.textContent.trim().length>3e3?{handled:!1}:(htmlContent=yield(html=htmlContent,__awaiter(void 0,void 0,void 0,function*(){const doc=(new DOMParser).parseFromString(html,"text/html"),images=Array.from(doc.getElementsByTagName("img"));for(const img of images)if(img.src&&img.src.startsWith("blob:"))try{const dataUrl=yield convertBlobToDataURL(img.src);img.src=dataUrl,img.style.maxWidth="100%"}catch(error){console.error("Error converting blob to data URL:",error)}return doc.body.innerHTML})),{handled:!0,content:htmlContent}):{handled:!1};var html})}handleBatchTransResult(sourcetexts,targetTexts){let doc=this.getDocument(),iframe=this.getIframe();if(doc&&iframe){for(let index=0;index{child.setAttribute("style",(child.getAttribute("style")||"")+";font-size:0px !important;")})}}}}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}}handleWordDefinitionResult(results,lang,locale){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;clearWordDefinitions(doc);const nodeList=getBlockElement(doc.body).filter(item=>!isParentBlock(item));for(const result of results){const{text:text,words:words}=result;if(!words||0===words.length)continue;const targetNode=nodeList.find(n=>n.textContent===text);if(!targetNode)continue;const nodeDefMap={};for(const def of words)if("zh"===lang){const simplified=def.simplified||"",traditional=def.traditional||"";simplified&&(nodeDefMap[simplified]=def),traditional&&traditional!==simplified&&(nodeDefMap[traditional]=def)}else{const key=(def.word||"").toLowerCase();key&&(nodeDefMap[key]=def)}applyWordDefinitions(nodeDefMap,doc,lang,locale,targetNode)}"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px")}clearWordDefinitionResult(){let doc=this.getDocument();doc&&clearWordDefinitions(doc)}}GeneralRender.SIZE_PER_CHAR={TXT:1.5,MD:2,DOCX:2.5,HTML:3,MHTML:3,XHTML:3,HTM:3,XML:3,EPUB:4.5,MOBI:4.5,FB2:5,PDFTEXT:.5};const mimetype={svg:"image/svg+xml",png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",zip:"application/zip",rar:"application/x-rar-compressed","7z":"application/x-7z-compressed",tar:"application/x-tar",html:"text/html",htm:"text/html",xml:"text/xml",xhtml:"application/xhtml+xml",css:"text/css"},mimetypeReverse={"image/svg+xml":"svg","image/png":"png","image/jpeg":"jpg","image/gif":"gif","image/webp":"webp","application/zip":"zip","application/x-rar-compressed":"rar","application/x-7z-compressed":"7z","application/x-tar":"tar","text/html":"html","text/xml":"xml","application/xhtml+xml":"xhtml","text/css":"css"},makeCacheBook=bookBuffer=>__awaiter(void 0,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(bookBuffer);var tocZip=zip.file("toc.json");let toc=[];tocZip&&(toc=JSON.parse(yield tocZip.async("string")));var sectionsZip=zip.file("sections.json");let sections=[];sectionsZip&&(sections=JSON.parse(yield sectionsZip.async("string")));const book={getCover:()=>""};return book.sections=sections.map((item,index)=>({id:item.href,load:()=>(index=>__awaiter(void 0,void 0,void 0,function*(){var chapterZip=zip.file("chapters/"+index+".html");let chapter="";return chapterZip&&(chapter=yield chapterZip.async("string")),URL.createObjectURL(new Blob([chapter],{type:"text/html"}))}))(index),unload:()=>{},loadAsset:url=>(url=>__awaiter(void 0,void 0,void 0,function*(){var assetZip=zip.file(url);let asset;return assetZip&&(asset=yield assetZip.async("arraybuffer")),URL.createObjectURL(new Blob([asset],{type:mimetype[url.split(".").reverse()[0]]}))}))(url)})),book.toc=toc.map(item=>({label:item.label,href:item.href,subitems:item.subitems})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:_.findLastIndex(sections,{href:href})}),book.resolveHrefIndex=href=>({index:_.findLastIndex(sections,{href:href})}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book}),getCache=book=>new Promise((resolve,reject)=>__awaiter(void 0,void 0,void 0,function*(){let parser=new GeneralParser(book),chapterList=yield parser.getChapter(book.toc),chapterDocList=yield parser.getChapterDoc(),toc=chapterList,sections=chapterDocList.map(item=>({href:item.href,label:item.label})),chapterTexts=yield Promise.all(chapterDocList.map(item=>__awaiter(void 0,void 0,void 0,function*(){let chapterText="";if(item.text&&item.text.load){let blob=yield fetch(yield item.text.load()).then(r=>r.blob());chapterText=yield blob.text()}return chapterText}))),zip=new JSZip;zip.file("toc.json",JSON.stringify(toc)),zip.file("sections.json",JSON.stringify(sections));let chapters=[];for(let index=0;indexr.blob());subImgZip.file(subindex+"."+mimetypeReverse[blob.type],blob);let newUrl="imgs/"+index+"/"+subindex+"."+mimetypeReverse[blob.type];imgDomList[subindex].src=newUrl,imgDomList[subindex].getAttribute("xlink:href")&&imgDomList[subindex].setAttribute("xlink:href",newUrl)}catch(error){console.error(error)}}let linkList=Array.from(chapterDoc.getElementsByTagName("link"));for(let subindex=0;subindexr.blob());subCssZip.file(subindex+"."+mimetypeReverse[blob.type],blob),link.href="css/"+index+"/"+subindex+"."+mimetypeReverse[blob.type]}catch(error){console.error(error)}}chapters.push(chapterDoc.documentElement.innerHTML)}let configZip=zip.folder("chapters");if(configZip){for(let index=0;index__awaiter(void 0,void 0,void 0,function*(){resolve(yield new Response(blob).arrayBuffer())})).catch(err=>{resolve("err")})}})),MAX_32_BITS=4294967295,MAX_16_BITS=65535;let maxWorkers=2;try{"undefined"!=typeof navigator&&navigator.hardwareConcurrency&&(maxWorkers=navigator.hardwareConcurrency)}catch{}const DEFAULT_CONFIGURATION={workerURI:"./core/web-worker-wasm.js",wasmURI:"./core/streams/zlib-wasm/zlib-streams.wasm",chunkSize:65536,maxWorkers:maxWorkers,terminateWorkerTimeout:5e3,useWebWorkers:!0,useCompressionStream:!0,CompressionStream:"undefined"!=typeof CompressionStream&&CompressionStream,DecompressionStream:"undefined"!=typeof DecompressionStream&&DecompressionStream},config=Object.assign({},DEFAULT_CONFIGURATION);function configure(configuration){const{baseURI:baseURI,chunkSize:chunkSize,maxWorkers:maxWorkers,terminateWorkerTimeout:terminateWorkerTimeout,useCompressionStream:useCompressionStream,useWebWorkers:useWebWorkers,CompressionStream:CompressionStream,DecompressionStream:DecompressionStream,CompressionStreamZlib:CompressionStreamZlib,DecompressionStreamZlib:DecompressionStreamZlib,workerURI:workerURI,wasmURI:wasmURI}=configuration;setIfDefined("baseURI",baseURI),setIfDefined("wasmURI",wasmURI),setIfDefined("workerURI",workerURI),setIfDefined("chunkSize",chunkSize),setIfDefined("maxWorkers",maxWorkers),setIfDefined("terminateWorkerTimeout",terminateWorkerTimeout),setIfDefined("useCompressionStream",useCompressionStream),setIfDefined("useWebWorkers",useWebWorkers),setIfDefined("CompressionStream",CompressionStream),setIfDefined("DecompressionStream",DecompressionStream),setIfDefined("CompressionStreamZlib",CompressionStreamZlib),setIfDefined("DecompressionStreamZlib",DecompressionStreamZlib)}function setIfDefined(propertyName,propertyValue){void 0!==propertyValue&&(config[propertyName]=propertyValue)}const table$1=[];for(let i=0;i<256;i++){let t=i;for(let j=0;j<8;j++)1&t?t=t>>>1^3988292384:t>>>=1;table$1[i]=t}class Crc32{constructor(crc){this.crc=crc||-1}append(data){let crc=0|this.crc;for(let offset=0,length=0|data.length;offset>>8^table$1[255&(crc^data[offset])];this.crc=crc}get(){return~this.crc}}class Crc32Stream extends TransformStream{constructor(){let stream;const crc32=new Crc32;super({transform(chunk,controller){crc32.append(chunk),controller.enqueue(chunk)},flush(){const value=new Uint8Array(4);new DataView(value.buffer).setUint32(0,crc32.get()),stream.value=value}}),stream=this}}const bitArray={concat(a1,a2){if(0===a1.length||0===a2.length)return a1.concat(a2);const last=a1[a1.length-1],shift=bitArray.getPartial(last);return 32===shift?a1.concat(a2):bitArray._shiftRight(a2,shift,0|last,a1.slice(0,a1.length-1))},bitLength(a){const l=a.length;if(0===l)return 0;const x=a[l-1];return 32*(l-1)+bitArray.getPartial(x)},clamp(a,len){if(32*a.length0&&len&&(a[l-1]=bitArray.partial(len,a[l-1]&2147483648>>len-1,1)),a},partial:(len,x,_end)=>32===len?x:(_end?0|x:x<<32-len)+1099511627776*len,getPartial:x=>Math.round(x/1099511627776)||32,_shiftRight(a,shift,carry,out){for(void 0===out&&(out=[]);shift>=32;shift-=32)out.push(carry),carry=0;if(0===shift)return out.concat(a);for(let i=0;i>>shift),carry=a[i]<<32-shift;const last2=a.length?a[a.length-1]:0,shift2=bitArray.getPartial(last2);return out.push(bitArray.partial(shift+shift2&31,shift+shift2>32?carry:out.pop(),1)),out}},codec={bytes:{fromBits(arr){const byteLength=bitArray.bitLength(arr)/8,out=new Uint8Array(byteLength);let tmp;for(let i=0;i>>24,tmp<<=8;return out},toBits(bytes){const out=[];let i,tmp=0;for(i=0;i9007199254740991)throw new Error("Cannot hash more than 2^53 - 1 bits");const c=new Uint32Array(b);let j=0;for(let i=sha1.blockSize+ol-(sha1.blockSize+ol&sha1.blockSize-1);i<=nl;i+=sha1.blockSize)sha1._block(c.subarray(16*j,16*(j+1))),j+=1;return b.splice(0,16*j),sha1}finalize(){const sha1=this;let b=sha1._buffer;const h=sha1._h;b=bitArray.concat(b,[bitArray.partial(1,1)]);for(let i=b.length+2;15&i;i++)b.push(0);for(b.push(Math.floor(sha1._length/4294967296)),b.push(0|sha1._length);b.length;)sha1._block(b.splice(0,16));return sha1.reset(),h}_f(t,b,c,d){return t<=19?b&c|~b&d:t<=39?b^c^d:t<=59?b&c|b&d|c&d:t<=79?b^c^d:void 0}_S(n,x){return x<>>32-n}_block(words){const sha1=this,h=sha1._h,w=Array(80);for(let j=0;j<16;j++)w[j]=words[j];let a=h[0],b=h[1],c=h[2],d=h[3],e=h[4];for(let t=0;t<=79;t++){t>=16&&(w[t]=sha1._S(1,w[t-3]^w[t-8]^w[t-14]^w[t-16]));const tmp=sha1._S(5,a)+sha1._f(t,b,c,d)+e+w[t]+sha1._key[Math.floor(t/20)]|0;e=d,d=c,c=sha1._S(30,b),b=a,a=tmp}h[0]=h[0]+a|0,h[1]=h[1]+b|0,h[2]=h[2]+c|0,h[3]=h[3]+d|0,h[4]=h[4]+e|0}}},cipher={aes:class{constructor(key){const aes=this;aes._tables=[[[],[],[],[],[]],[[],[],[],[],[]]],aes._tables[0][0][0]||aes._precompute();const sbox=aes._tables[0][4],decTable=aes._tables[1],keyLen=key.length;let i,encKey,decKey,rcon=1;if(4!==keyLen&&6!==keyLen&&8!==keyLen)throw new Error("invalid aes key size");for(aes._key=[encKey=key.slice(0),decKey=[]],i=keyLen;i<4*keyLen+28;i++){let tmp=encKey[i-1];(i%keyLen===0||8===keyLen&&i%keyLen===4)&&(tmp=sbox[tmp>>>24]<<24^sbox[tmp>>16&255]<<16^sbox[tmp>>8&255]<<8^sbox[255&tmp],i%keyLen===0&&(tmp=tmp<<8^tmp>>>24^rcon<<24,rcon=rcon<<1^283*(rcon>>7))),encKey[i]=encKey[i-keyLen]^tmp}for(let j=0;i;j++,i--){const tmp=encKey[3&j?i:i-4];decKey[j]=i<=4||j<4?tmp:decTable[0][sbox[tmp>>>24]]^decTable[1][sbox[tmp>>16&255]]^decTable[2][sbox[tmp>>8&255]]^decTable[3][sbox[255&tmp]]}}encrypt(data){return this._crypt(data,0)}decrypt(data){return this._crypt(data,1)}_precompute(){const encTable=this._tables[0],decTable=this._tables[1],sbox=encTable[4],sboxInv=decTable[4],d=[],th=[];let xInv,x2,x4,x8;for(let i=0;i<256;i++)th[(d[i]=i<<1^283*(i>>7))^i]=i;for(let x=xInv=0;!sbox[x];x^=x2||1,xInv=th[xInv]||1){let s=xInv^xInv<<1^xInv<<2^xInv<<3^xInv<<4;s=s>>8^255&s^99,sbox[x]=s,sboxInv[s]=x,x8=d[x4=d[x2=d[x]]];let tDec=16843009*x8^65537*x4^257*x2^16843008*x,tEnc=257*d[s]^16843008*s;for(let i=0;i<4;i++)encTable[i][x]=tEnc=tEnc<<24^tEnc>>>8,decTable[i][s]=tDec=tDec<<24^tDec>>>8}for(let i=0;i<5;i++)encTable[i]=encTable[i].slice(0),decTable[i]=decTable[i].slice(0)}_crypt(input,dir){if(4!==input.length)throw new Error("invalid aes block size");const key=this._key[dir],nInnerRounds=key.length/4-2,out=[0,0,0,0],table=this._tables[dir],t0=table[0],t1=table[1],t2=table[2],t3=table[3],sbox=table[4];let a2,b2,c2,a=input[0]^key[0],b=input[dir?3:1]^key[1],c=input[2]^key[2],d=input[dir?1:3]^key[3],kIndex=4;for(let i=0;i>>24]^t1[b>>16&255]^t2[c>>8&255]^t3[255&d]^key[kIndex],b2=t0[b>>>24]^t1[c>>16&255]^t2[d>>8&255]^t3[255&a]^key[kIndex+1],c2=t0[c>>>24]^t1[d>>16&255]^t2[a>>8&255]^t3[255&b]^key[kIndex+2],d=t0[d>>>24]^t1[a>>16&255]^t2[b>>8&255]^t3[255&c]^key[kIndex+3],kIndex+=4,a=a2,b=b2,c=c2;for(let i=0;i<4;i++)out[dir?3&-i:i]=sbox[a>>>24]<<24^sbox[b>>16&255]<<16^sbox[c>>8&255]<<8^sbox[255&d]^key[kIndex++],a2=a,a=b,b=c,c=d,d=a2;return out}}},random={getRandomValues(typedArray){const words=new Uint32Array(typedArray.buffer),r=m_w=>{let m_z=987654321;const mask=4294967295;return function(){m_z=36969*(65535&m_z)+(m_z>>16)&mask;return(((m_z<<16)+(m_w=18e3*(65535&m_w)+(m_w>>16)&mask)&mask)/4294967296+.5)*(Math.random()>.5?1:-1)}};for(let rcache,i=0;i>24))word+=1<<24;else{let b1=word>>16&255,b2=word>>8&255,b3=255&word;255===b1?(b1=0,255===b2?(b2=0,255===b3?b3=0:++b3):++b2):++b1,word=0,word+=b1<<16,word+=b2<<8,word+=b3}return word}incCounter(counter){0===(counter[0]=this.incWord(counter[0]))&&(counter[1]=this.incWord(counter[1]))}calculate(prf,data,iv){let l;if(!(l=data.length))return[];const bl=bitArray.bitLength(data);for(let i=0;inew misc.hmacSha1(codec.bytes.toBits(password)),pbkdf2(prf,salt,count,length){if(count=count||1e4,length<0||count<0)throw new Error("invalid params to pbkdf2");const byteLength=1+(length>>5)<<2;let u,ui,i,j,k;const arrayBuffer=new ArrayBuffer(byteLength),out=new DataView(arrayBuffer);let outLength=0;const b=bitArray;for(salt=codec.bytes.toBits(salt),k=1;outLength<(byteLength||1);k++){for(u=ui=prf.encrypt(b.concat(salt,[k])),i=1;ibs&&(key=(new Hash).update(key).finalize());for(let i=0;ithis.resolveReady=resolve),password:encodePassword(password,rawPassword),signed:signed,strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;password?(await async function(decrypt,strength,password,preamble){const passwordVerificationKey=await createKeys$1(decrypt,strength,password,subarray(preamble,0,SALT_LENGTH[strength])),passwordVerification=subarray(preamble,SALT_LENGTH[strength]);if(passwordVerificationKey[0]!=passwordVerification[0]||passwordVerificationKey[1]!=passwordVerification[1])throw new Error("Invalid password")}(aesCrypto,strength,password,subarray(chunk,0,SALT_LENGTH[strength]+2)),chunk=subarray(chunk,SALT_LENGTH[strength]+2),checkPasswordOnly?controller.error(new Error("zipjs-abort-check-password")):resolveReady()):await ready;const output=new Uint8Array(chunk.length-10-(chunk.length-10)%16);controller.enqueue(append(aesCrypto,chunk,output,0,10,!0))},async flush(controller){const{signed:signed,ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;const chunkToDecrypt=subarray(pending,0,pending.length-10),originalSignature=subarray(pending,pending.length-10);let decryptedChunkArray=new Uint8Array;if(chunkToDecrypt.length){const encryptedChunk=toBits(codecBytes,chunkToDecrypt);hmac.update(encryptedChunk);const decryptedChunk=ctr.update(encryptedChunk);decryptedChunkArray=fromBits(codecBytes,decryptedChunk)}if(signed){const signature=subarray(fromBits(codecBytes,hmac.digest()),0,10);for(let indexSignature=0;indexSignature<10;indexSignature++)if(signature[indexSignature]!=originalSignature[indexSignature])throw new Error("Invalid signature")}controller.enqueue(decryptedChunkArray)}}})}}class AESEncryptionStream extends TransformStream{constructor({password:password,rawPassword:rawPassword,encryptionStrength:encryptionStrength}){let stream;super({start(){Object.assign(this,{ready:new Promise(resolve=>this.resolveReady=resolve),password:encodePassword(password,rawPassword),strength:encryptionStrength-1,pending:new Uint8Array})},async transform(chunk,controller){const aesCrypto=this,{password:password,strength:strength,resolveReady:resolveReady,ready:ready}=aesCrypto;let preamble=new Uint8Array;password?(preamble=await async function(encrypt,strength,password){const salt=getRandomValues(new Uint8Array(SALT_LENGTH[strength])),passwordVerification=await createKeys$1(encrypt,strength,password,salt);return concat(salt,passwordVerification)}(aesCrypto,strength,password),resolveReady()):await ready;const output=new Uint8Array(preamble.length+chunk.length-chunk.length%16);output.set(preamble,0),controller.enqueue(append(aesCrypto,chunk,output,preamble.length,0))},async flush(controller){const{ctr:ctr,hmac:hmac,pending:pending,ready:ready}=this;if(hmac&&ctr){await ready;let encryptedChunkArray=new Uint8Array;if(pending.length){const encryptedChunk=ctr.update(toBits(codecBytes,pending));hmac.update(encryptedChunk),encryptedChunkArray=fromBits(codecBytes,encryptedChunk)}stream.signature=fromBits(codecBytes,hmac.digest()).slice(0,10),controller.enqueue(concat(encryptedChunkArray,stream.signature))}}}),stream=this}}function append(aesCrypto,input,output,paddingStart,paddingEnd,verifySignature){const{ctr:ctr,hmac:hmac,pending:pending}=aesCrypto,inputLength=input.length-paddingEnd;let offset;for(pending.length&&(input=concat(pending,input),output=function(inputArray,length){if(length&&length>inputArray.length){const array=inputArray;(inputArray=new Uint8Array(length)).set(array,0)}return inputArray}(output,inputLength-inputLength%16)),offset=0;offset<=inputLength-16;offset+=16){const inputChunk=toBits(codecBytes,subarray(input,offset,offset+16));verifySignature&&hmac.update(inputChunk);const outputChunk=ctr.update(inputChunk);verifySignature||hmac.update(outputChunk),output.set(fromBits(codecBytes,outputChunk),offset+paddingStart)}return aesCrypto.pending=subarray(input,offset),output}async function createKeys$1(aesCrypto,strength,password,salt){aesCrypto.password=null;const baseKey=await async function(format,password,algorithm,extractable,keyUsages){if(!IMPORT_KEY_SUPPORTED)return misc.importKey(password);try{return await subtle.importKey(format,password,algorithm,extractable,keyUsages)}catch{return IMPORT_KEY_SUPPORTED=!1,misc.importKey(password)}}("raw",password,BASE_KEY_ALGORITHM,!1,DERIVED_BITS_USAGE),derivedBits=await async function(algorithm,baseKey,length){if(!DERIVE_BITS_SUPPORTED)return misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length);try{return await subtle.deriveBits(algorithm,baseKey,length)}catch{return DERIVE_BITS_SUPPORTED=!1,misc.pbkdf2(baseKey,algorithm.salt,DERIVED_BITS_ALGORITHM.iterations,length)}}(Object.assign({salt:salt},DERIVED_BITS_ALGORITHM),baseKey,8*(2*KEY_LENGTH[strength]+2)),compositeKey=new Uint8Array(derivedBits),key=toBits(codecBytes,subarray(compositeKey,0,KEY_LENGTH[strength])),authentication=toBits(codecBytes,subarray(compositeKey,KEY_LENGTH[strength],2*KEY_LENGTH[strength])),passwordVerification=subarray(compositeKey,2*KEY_LENGTH[strength]);return Object.assign(aesCrypto,{keys:{key:key,authentication:authentication,passwordVerification:passwordVerification},ctr:new CtrGladman(new Aes(key),Array.from(COUNTER_DEFAULT_VALUE)),hmac:new HmacSha1(authentication)}),passwordVerification}function encodePassword(password,rawPassword){return void 0===rawPassword?function(value){if("undefined"==typeof TextEncoder){value=unescape(encodeURIComponent(value));const result=new Uint8Array(value.length);for(let i=0;i>>24]),key2=~target.crcKey2.get(),target.keys=[key0,key1,key2]}function getByte(target){const temp=2|target.keys[2];return getInt8(Math.imul(temp,1^temp)>>>8)}function getInt8(number){return 255&number}function getInt32(number){return 4294967295&number}class DeflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,CompressionStreamZlib:CompressionStreamZlib,CompressionStream:CompressionStream}){super({});const{compressed:compressed,encrypted:encrypted,useCompressionStream:useCompressionStream,zipCrypto:zipCrypto,signed:signed,level:level}=options,stream=this;let crc32Stream,encryptionStream,readable=super.readable;encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{level:level,chunkSize:chunkSize},CompressionStream,CompressionStreamZlib,CompressionStream)),encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoEncryptionStream(options)):(encryptionStream=new AESEncryptionStream(options),readable=pipeThrough(readable,encryptionStream))),setReadable(stream,readable,()=>{let signature;encrypted&&!zipCrypto&&(signature=encryptionStream.signature),encrypted&&!zipCrypto||!signed||(signature=new DataView(crc32Stream.value.buffer).getUint32(0)),stream.signature=signature})}}class InflateStream extends TransformStream{constructor(options,{chunkSize:chunkSize,DecompressionStreamZlib:DecompressionStreamZlib,DecompressionStream:DecompressionStream}){super({});const{zipCrypto:zipCrypto,encrypted:encrypted,signed:signed,signature:signature,compressed:compressed,useCompressionStream:useCompressionStream,deflate64:deflate64}=options;let crc32Stream,decryptionStream,readable=super.readable;encrypted&&(zipCrypto?readable=pipeThrough(readable,new ZipCryptoDecryptionStream(options)):(decryptionStream=new AESDecryptionStream(options),readable=pipeThrough(readable,decryptionStream))),compressed&&(readable=pipeThroughCommpressionStream(readable,useCompressionStream,{chunkSize:chunkSize,deflate64:deflate64},DecompressionStream,DecompressionStreamZlib,DecompressionStream)),encrypted&&!zipCrypto||!signed||(crc32Stream=new Crc32Stream,readable=pipeThrough(readable,crc32Stream)),setReadable(this,readable,()=>{if((!encrypted||zipCrypto)&&signed){const dataViewSignature=new DataView(crc32Stream.value.buffer);if(signature!=dataViewSignature.getUint32(0,!1))throw new Error("Invalid signature")}})}}function setReadable(stream,readable,flush){readable=pipeThrough(readable,new TransformStream({flush:flush})),Object.defineProperty(stream,"readable",{get:()=>readable})}function pipeThroughCommpressionStream(readable,useCompressionStream,options,CompressionStreamNative,CompressionStreamZlib,CompressionStream){const Stream=useCompressionStream&&CompressionStreamNative?CompressionStreamNative:CompressionStreamZlib||CompressionStream,format=options.deflate64?"deflate64-raw":"deflate-raw";try{readable=pipeThrough(readable,new Stream(format,options))}catch(error){if(!useCompressionStream)throw error;if(CompressionStreamZlib)readable=pipeThrough(readable,new CompressionStreamZlib(format,options));else{if(!CompressionStream)throw error;readable=pipeThrough(readable,new CompressionStream(format,options))}}return readable}function pipeThrough(readable,transformStream){return readable.pipeThrough(transformStream)}class CodecStream extends TransformStream{constructor(options,config){super({});const codec=this,{codecType:codecType}=options;let Stream;codecType.startsWith("deflate")?Stream=DeflateStream:codecType.startsWith("inflate")&&(Stream=InflateStream),codec.outputSize=0;let inputSize=0;const stream=new Stream(options,config),readable=super.readable,inputSizeStream=new TransformStream({transform(chunk,controller){chunk&&chunk.length&&(inputSize+=chunk.length,controller.enqueue(chunk))},flush(){Object.assign(codec,{inputSize:inputSize})}}),outputSizeStream=new TransformStream({transform(chunk,controller){if(chunk&&chunk.length&&(controller.enqueue(chunk),codec.outputSize+=chunk.length,void 0!==options.outputSize&&codec.outputSize>options.outputSize))throw new Error("Invalid uncompressed size")},flush(){const{signature:signature}=stream;Object.assign(codec,{signature:signature,inputSize:inputSize})}});Object.defineProperty(codec,"readable",{get:()=>readable.pipeThrough(inputSizeStream).pipeThrough(stream).pipeThrough(outputSizeStream)})}}class ChunkStream extends TransformStream{constructor(chunkSize){let pendingChunk;super({transform:function transform(chunk,controller){if(pendingChunk){const newChunk=new Uint8Array(pendingChunk.length+chunk.length);newChunk.set(pendingChunk),newChunk.set(chunk,pendingChunk.length),chunk=newChunk,pendingChunk=null}chunk.length>chunkSize?(controller.enqueue(chunk.slice(0,chunkSize)),transform(chunk.slice(chunkSize),controller)):pendingChunk=chunk},flush(controller){pendingChunk&&pendingChunk.length&&controller.enqueue(pendingChunk)}})}}const MODULE_WORKER_OPTIONS={type:"module"};let webWorkerSupported,webWorkerURI,webWorkerOptions,transferStreamsSupported=!0;try{transferStreamsSupported="function"==typeof structuredClone&&void 0!==structuredClone(new DOMException("","AbortError")).code}catch{}let initModule$1=()=>{};class CodecWorker{constructor(workerData,{readable:readable,writable:writable},{options:options,config:config,streamOptions:streamOptions,useWebWorkers:useWebWorkers,transferStreams:transferStreams,workerURI:workerURI},onTaskFinished){const{signal:signal}=streamOptions;return Object.assign(workerData,{busy:!0,readable:readable.pipeThrough(new ChunkStream(config.chunkSize)).pipeThrough(new ProgressWatcherStream(streamOptions),{signal:signal}),writable:writable,options:Object.assign({},options),workerURI:workerURI,transferStreams:transferStreams,terminate:()=>new Promise(resolve=>{const{worker:worker,busy:busy}=workerData;worker?(busy?workerData.resolveTerminated=resolve:(worker.terminate(),resolve()),workerData.interface=null):resolve()}),onTaskFinished(){const{resolveTerminated:resolveTerminated}=workerData;resolveTerminated&&(workerData.resolveTerminated=null,workerData.terminated=!0,workerData.worker.terminate(),resolveTerminated()),workerData.busy=!1,onTaskFinished(workerData)}}),void 0===webWorkerSupported&&(webWorkerSupported="undefined"!=typeof Worker),(useWebWorkers&&webWorkerSupported?createWebWorkerInterface:createWorkerInterface)(workerData,config)}}class ProgressWatcherStream extends TransformStream{constructor({onstart:onstart,onprogress:onprogress,size:size,onend:onend}){let chunkOffset=0;super({async start(){onstart&&await callHandler(onstart,size)},async transform(chunk,controller){chunkOffset+=chunk.length,onprogress&&await callHandler(onprogress,chunkOffset,size),controller.enqueue(chunk)},async flush(){onend&&await callHandler(onend,chunkOffset)}})}}async function callHandler(handler,...parameters){try{await handler(...parameters)}catch{}}function createWorkerInterface(workerData,config){return{run:()=>async function({options:options,readable:readable,writable:writable,onTaskFinished:onTaskFinished},config){let codecStream;try{if(!options.useCompressionStream)try{await initModule$1(config)}catch{options.useCompressionStream=!0}codecStream=new CodecStream(options,config),await readable.pipeThrough(codecStream).pipeTo(writable,{preventClose:!0,preventAbort:!0});const{signature:signature,inputSize:inputSize,outputSize:outputSize}=codecStream;return{signature:signature,inputSize:inputSize,outputSize:outputSize}}catch(error){throw codecStream&&(error.outputSize=codecStream.outputSize),error}finally{onTaskFinished()}}(workerData,config)}}function createWebWorkerInterface(workerData,config){const{baseURI:baseURI,chunkSize:chunkSize}=config;let{wasmURI:wasmURI}=config;if(!workerData.interface){let worker;"function"==typeof wasmURI&&(wasmURI=wasmURI());try{worker=getWebWorker(workerData.workerURI,baseURI,workerData)}catch{return webWorkerSupported=!1,createWorkerInterface(workerData,config)}Object.assign(workerData,{worker:worker,interface:{run:()=>async function(workerData,config){let resolveResult,rejectResult;const result=new Promise((resolve,reject)=>{resolveResult=resolve,rejectResult=reject});Object.assign(workerData,{reader:null,writer:null,resolveResult:resolveResult,rejectResult:rejectResult,result:result});const{readable:readable,options:options}=workerData,{writable:writable,closed:closed}=function(writableSource){const{writable:writable,readable:readable}=new TransformStream,closed=readable.pipeTo(writableSource,{preventClose:!0});return{writable:writable,closed:closed}}(workerData.writable),streamsTransferred=sendMessage({type:"start",options:options,config:config,readable:readable,writable:writable},workerData);streamsTransferred||Object.assign(workerData,{reader:readable.getReader(),writer:writable.getWriter()});const resultValue=await result;streamsTransferred||await writable.getWriter().close();return await closed,resultValue}(workerData,{chunkSize:chunkSize,wasmURI:wasmURI,baseURI:baseURI})}})}return workerData.interface}function getWebWorker(url,baseURI,workerData,isModuleType,useBlobURI=!0){let worker,resolvedURI,resolvedOptions;if(void 0===webWorkerURI){const isFunctionURI="function"==typeof url;resolvedURI=isFunctionURI?url(useBlobURI):url;const isDataURI=resolvedURI.startsWith("data:"),isBlobURI=resolvedURI.startsWith("blob:");if(isDataURI||isBlobURI){void 0===isModuleType&&(isModuleType=!1),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isBlobURI)try{URL.revokeObjectURL(resolvedURI)}catch{}if(isFunctionURI&&isBlobURI)return getWebWorker(url,baseURI,workerData,isModuleType,!1);if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!0,!1)}}else{void 0===isModuleType&&(isModuleType=!0),isModuleType&&(resolvedOptions=MODULE_WORKER_OPTIONS);try{resolvedURI=new URL(resolvedURI,baseURI)}catch{}try{worker=new Worker(resolvedURI,resolvedOptions)}catch(error){if(isModuleType)throw error;return getWebWorker(url,baseURI,workerData,!1,useBlobURI)}}webWorkerURI=resolvedURI,webWorkerOptions=resolvedOptions}else worker=new Worker(webWorkerURI,webWorkerOptions);return worker.addEventListener("message",event=>async function({data:data},workerData){const{type:type,value:value,messageId:messageId,result:result,error:error}=data,{reader:reader,writer:writer,resolveResult:resolveResult,rejectResult:rejectResult,onTaskFinished:onTaskFinished}=workerData;try{if(error){const{message:message,stack:stack,code:code,name:name,outputSize:outputSize}=error,responseError=new Error(message);Object.assign(responseError,{stack:stack,code:code,name:name,outputSize:outputSize}),close(responseError)}else{if("pull"==type){const{value:value,done:done}=await reader.read();sendMessage({type:"data",value:value,done:done,messageId:messageId},workerData)}"data"==type&&(await writer.ready,await writer.write(new Uint8Array(value)),sendMessage({type:"ack",messageId:messageId},workerData)),"close"==type&&close(null,result)}}catch(error){sendMessage({type:"close",messageId:messageId},workerData),close(error)}function close(error,result){error?rejectResult(error):resolveResult(result),writer&&writer.releaseLock(),onTaskFinished()}}(event,workerData)),worker}function sendMessage(message,{worker:worker,writer:writer,onTaskFinished:onTaskFinished,transferStreams:transferStreams}){try{const{value:value,readable:readable,writable:writable}=message,transferables=[];if(value&&(message.value=value,transferables.push(message.value.buffer)),transferStreams&&transferStreamsSupported?(readable&&transferables.push(readable),writable&&transferables.push(writable)):message.readable=message.writable=null,transferables.length)try{return worker.postMessage(message,transferables),!0}catch{transferStreamsSupported=!1,message.readable=message.writable=null,worker.postMessage(message)}else worker.postMessage(message)}catch(error){throw writer&&writer.releaseLock(),onTaskFinished(),error}}let pool=[];const pendingRequests=[];let indexWorker=0;async function runWorker(stream,workerOptions){const{options:options,config:config}=workerOptions,{transferStreams:transferStreams,useWebWorkers:useWebWorkers,useCompressionStream:useCompressionStream,compressed:compressed,signed:signed,encrypted:encrypted}=options,{workerURI:workerURI,maxWorkers:maxWorkers}=config;workerOptions.transferStreams=transferStreams||void 0===transferStreams;const streamCopy=!(compressed||signed||encrypted||workerOptions.transferStreams);return workerOptions.useWebWorkers=!streamCopy&&(useWebWorkers||void 0===useWebWorkers&&config.useWebWorkers),workerOptions.workerURI=workerOptions.useWebWorkers&&workerURI?workerURI:void 0,options.useCompressionStream=useCompressionStream||void 0===useCompressionStream&&config.useCompressionStream,(await async function(){const workerData=pool.find(workerData=>!workerData.busy);if(workerData)return clearTerminateTimeout(workerData),new CodecWorker(workerData,stream,workerOptions,onTaskFinished);if(pool.lengthpendingRequests.push({resolve:resolve,stream:stream,workerOptions:workerOptions}))}()).run();function onTaskFinished(workerData){if(pendingRequests.length){const[{resolve:resolve,stream:stream,workerOptions:workerOptions}]=pendingRequests.splice(0,1);resolve(new CodecWorker(workerData,stream,workerOptions,onTaskFinished))}else workerData.worker?(clearTerminateTimeout(workerData),function(workerData,workerOptions){const{config:config}=workerOptions,{terminateWorkerTimeout:terminateWorkerTimeout}=config;Number.isFinite(terminateWorkerTimeout)&&terminateWorkerTimeout>=0&&(workerData.terminated?workerData.terminated=!1:workerData.terminateTimeout=setTimeout(async()=>{pool=pool.filter(data=>data!=workerData);try{await workerData.terminate()}catch{}},terminateWorkerTimeout))}(workerData,workerOptions)):pool=pool.filter(data=>data!=workerData)}}function clearTerminateTimeout(workerData){const{terminateTimeout:terminateTimeout}=workerData;terminateTimeout&&(clearTimeout(terminateTimeout),workerData.terminateTimeout=null)}const DEFAULT_CHUNK_SIZE=65536;class Stream{constructor(){this.size=0}init(){this.initialized=!0}}class Reader extends Stream{get readable(){const reader=this,{chunkSize:chunkSize=DEFAULT_CHUNK_SIZE}=reader,readable=new ReadableStream({start(){this.chunkOffset=0},async pull(controller){const{offset:offset=0,size:size,diskNumberStart:diskNumberStart}=readable,{chunkOffset:chunkOffset}=this,dataSize=void 0===size?chunkSize:Math.min(chunkSize,size-chunkOffset),data=await readUint8Array(reader,offset+chunkOffset,dataSize,diskNumberStart);controller.enqueue(data),chunkOffset+chunkSize>size||void 0===size&&!data.length&&dataSize?controller.close():this.chunkOffset+=chunkSize}});return readable}}class BlobReader extends Reader{constructor(blob){super(),Object.assign(this,{blob:blob,size:blob.size})}async readUint8Array(offset,length){const offsetEnd=offset+length,blob=offset||offsetEndlength&&(arrayBuffer=arrayBuffer.slice(offset,offsetEnd)),new Uint8Array(arrayBuffer)}}class BlobWriter extends Stream{constructor(contentType){super();const transformStream=new TransformStream,headers=[];contentType&&headers.push(["Content-Type",contentType]),Object.defineProperty(this,"writable",{get:()=>transformStream.writable}),this.blob=new Response(transformStream.readable,{headers:headers}).blob()}getData(){return this.blob}}class TextWriter extends BlobWriter{constructor(encoding){super(encoding),Object.assign(this,{encoding:encoding,utf8:!encoding||"utf-8"==encoding.toLowerCase()})}async getData(){const{encoding:encoding,utf8:utf8}=this,blob=await super.getData();if(blob.text&&utf8)return blob.text();{const reader=new FileReader;return new Promise((resolve,reject)=>{Object.assign(reader,{onload:({target:target})=>resolve(target.result),onerror:()=>reject(reader.error)}),reader.readAsText(blob,encoding)})}}}class SplitDataReader extends Reader{constructor(readers){super(),this.readers=readers}async init(){const reader=this,{readers:readers}=reader;reader.lastDiskNumber=0,reader.lastDiskOffset=0,await Promise.all(readers.map(async(diskReader,indexDiskReader)=>{await diskReader.init(),indexDiskReader!=readers.length-1&&(reader.lastDiskOffset+=diskReader.size),reader.size+=diskReader.size})),super.init()}async readUint8Array(offset,length,diskNumber=0){const reader=this,{readers:readers}=this;let result,currentDiskNumber=diskNumber;-1==currentDiskNumber&&(currentDiskNumber=readers.length-1);let currentReaderOffset=offset;for(;readers[currentDiskNumber]&¤tReaderOffset>=readers[currentDiskNumber].size;)currentReaderOffset-=readers[currentDiskNumber].size,currentDiskNumber++;const currentReader=readers[currentDiskNumber];if(currentReader){const currentReaderSize=currentReader.size;if(currentReaderOffset+length<=currentReaderSize)result=await readUint8Array(currentReader,currentReaderOffset,length);else{const chunkLength=currentReaderSize-currentReaderOffset;result=new Uint8Array(length);const firstPart=await readUint8Array(currentReader,currentReaderOffset,chunkLength);result.set(firstPart,0);const secondPart=await reader.readUint8Array(offset+chunkLength,length-chunkLength,diskNumber);result.set(secondPart,chunkLength),firstPart.length+secondPart.length=availableSize?(await writeChunk(chunk.subarray(0,availableSize)),await closeDisk(),writer.diskOffset+=diskSourceWriter.size,writer.diskNumber++,diskWriter=null,await this.write(chunk.subarray(availableSize))):await writeChunk(chunk);else{const{value:value,done:done}=await writerGenerator.next();if(done&&!value)throw new Error("Writer iterator completed too soon");diskSourceWriter=value,diskSourceWriter.size=0,diskSourceWriter.maxSize&&(writer.maxSize=diskSourceWriter.maxSize),writer.availableSize=writer.maxSize,await initStream(diskSourceWriter),diskWritable=value.writable,diskWriter=diskWritable.getWriter(),await this.write(chunk)}},async close(){await diskWriter.ready,await closeDisk()}});async function writeChunk(chunk){const chunkLength=chunk.length;chunkLength&&(await diskWriter.ready,await diskWriter.write(chunk),diskSourceWriter.size+=chunkLength,writer.size+=chunkLength,writer.availableSize-=chunkLength)}async function closeDisk(){await diskWriter.close()}Object.defineProperty(writer,"writable",{get:()=>writable})}}class GenericReader{constructor(reader){return Array.isArray(reader)&&(reader=new SplitDataReader(reader)),reader instanceof ReadableStream&&(reader={readable:reader}),reader}}class GenericWriter{constructor(writer){return void 0===writer.writable&&"function"==typeof writer.next&&(writer=new SplitDataWriter(writer)),writer instanceof WritableStream&&(writer={writable:writer}),void 0===writer.size&&(writer.size=0),writer instanceof SplitDataWriter||Object.assign(writer,{diskNumber:0,diskOffset:0,availableSize:Infinity,maxSize:Infinity}),writer}}async function initStream(stream,initSize){if(!stream.init||stream.initialized)return Promise.resolve();await stream.init(initSize)}function readUint8Array(reader,offset,size,diskNumber){return reader.readUint8Array(offset,size,diskNumber)}const CP437="\0☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜ¢£¥₧ƒáíóúñѪº¿⌐¬½¼¡«»░▒▓│┤╡╢╖╕╣║╗╝╜╛┐└┴┬├─┼╞╟╚╔╩╦╠═╬╧╨╤╥╙╘╒╓╫╪┘┌█▄▌▐▀αßΓπΣσµτΦΘΩδ∞φε∩≡±≥≤⌠⌡÷≈°∙·√ⁿ²■ ".split(""),VALID_CP437=256==CP437.length;function decodeText(value,encoding){return encoding&&"cp437"==encoding.trim().toLowerCase()?function(stringValue){if(VALID_CP437){let result="";for(let indexCharacter=0;indexCharacterthis[name]=data[name])}}const ERR_BAD_FORMAT="File format is not recognized",ZIP64_PROPERTIES=[["uncompressedSize",4294967295],["compressedSize",4294967295],["offset",4294967295],["diskNumberStart",65535]],ZIP64_EXTRACTION={[MAX_16_BITS]:{getValue:getUint32,bytes:4},[MAX_32_BITS]:{getValue:getBigUint64,bytes:8}};class ZipReader{constructor(reader,options={}){Object.assign(this,{reader:new GenericReader(reader),options:options,config:config,readRanges:[]})}async*getEntriesGenerator(options={}){const zipReader=this;let{reader:reader}=zipReader;const{config:config}=zipReader;if(await initStream(reader),void 0!==reader.size&&reader.readUint8Array||(reader=new BlobReader(await new Response(reader.readable).blob()),await initStream(reader)),reader.size<22)throw new Error(ERR_BAD_FORMAT);reader.chunkSize=function(config){return Math.max(config.chunkSize,64)}(config);const endOfDirectoryInfo=await async function(reader,signature,startOffset,minimumBytes,maximumLength){const signatureArray=new Uint8Array(4);!function(view,offset,value){view.setUint32(offset,value,!0)}(getDataView(signatureArray),0,signature);const maximumBytes=minimumBytes+maximumLength;return await seek(minimumBytes)||await seek(Math.min(maximumBytes,startOffset));async function seek(length){const offset=startOffset-length,bytes=await readUint8Array(reader,offset,length);for(let indexByte=bytes.length-minimumBytes;indexByte>=0;indexByte--)if(bytes[indexByte]==signatureArray[0]&&bytes[indexByte+1]==signatureArray[1]&&bytes[indexByte+2]==signatureArray[2]&&bytes[indexByte+3]==signatureArray[3])return{offset:offset+indexByte,buffer:bytes.slice(indexByte,indexByte+minimumBytes).buffer}}}(reader,101010256,reader.size,22,1048560);if(!endOfDirectoryInfo){throw 134695760==getUint32(getDataView(await readUint8Array(reader,0,4)))?new Error("Split zip file"):new Error("End of central directory not found")}const endOfDirectoryView=getDataView(endOfDirectoryInfo);let directoryDataLength=getUint32(endOfDirectoryView,12),directoryDataOffset=getUint32(endOfDirectoryView,16);const commentOffset=endOfDirectoryInfo.offset,commentLength=getUint16(endOfDirectoryView,20),appendedDataOffset=commentOffset+22+commentLength;let lastDiskNumber=getUint16(endOfDirectoryView,4);const expectedLastDiskNumber=reader.lastDiskNumber||0;let diskNumber=getUint16(endOfDirectoryView,6),filesLength=getUint16(endOfDirectoryView,8),prependedDataLength=0,startOffset=0;if(4294967295==directoryDataOffset||4294967295==directoryDataLength||65535==filesLength||65535==diskNumber){const endOfDirectoryLocatorView=getDataView(await readUint8Array(reader,endOfDirectoryInfo.offset-20,20));if(117853008==getUint32(endOfDirectoryLocatorView,0)){directoryDataOffset=getBigUint64(endOfDirectoryLocatorView,8);let endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray);const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-20-56;if(101075792!=getUint32(endOfDirectoryView,0)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength=directoryDataOffset-originalDirectoryDataOffset),endOfDirectoryArray=await readUint8Array(reader,directoryDataOffset,56,-1),endOfDirectoryView=getDataView(endOfDirectoryArray)}if(101075792!=getUint32(endOfDirectoryView,0))throw new Error("End of Zip64 central directory locator not found");65535==lastDiskNumber&&(lastDiskNumber=getUint32(endOfDirectoryView,16)),65535==diskNumber&&(diskNumber=getUint32(endOfDirectoryView,20)),65535==filesLength&&(filesLength=getBigUint64(endOfDirectoryView,32)),4294967295==directoryDataLength&&(directoryDataLength=getBigUint64(endOfDirectoryView,40)),directoryDataOffset-=directoryDataLength}}if(directoryDataOffset>=reader.size&&(prependedDataLength=reader.size-directoryDataOffset-directoryDataLength-22,directoryDataOffset=reader.size-directoryDataLength-22),expectedLastDiskNumber!=lastDiskNumber)throw new Error("Split zip file");if(directoryDataOffset<0)throw new Error(ERR_BAD_FORMAT);let offset=0,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray);if(directoryDataLength){const expectedDirectoryDataOffset=endOfDirectoryInfo.offset-directoryDataLength;if(33639248!=getUint32(directoryView,offset)&&directoryDataOffset!=expectedDirectoryDataOffset){const originalDirectoryDataOffset=directoryDataOffset;directoryDataOffset=expectedDirectoryDataOffset,directoryDataOffset>originalDirectoryDataOffset&&(prependedDataLength+=directoryDataOffset-originalDirectoryDataOffset),directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)}}const expectedDirectoryDataLength=endOfDirectoryInfo.offset-directoryDataOffset-(reader.lastDiskOffset||0);if(directoryDataLength!=expectedDirectoryDataLength&&expectedDirectoryDataLength>=0&&(directoryDataLength=expectedDirectoryDataLength,directoryArray=await readUint8Array(reader,directoryDataOffset,directoryDataLength,diskNumber),directoryView=getDataView(directoryArray)),directoryDataOffset<0||directoryDataOffset>=reader.size)throw new Error(ERR_BAD_FORMAT);const filenameEncoding=getOptionValue(zipReader,options,"filenameEncoding"),commentEncoding=getOptionValue(zipReader,options,"commentEncoding");for(let indexFile=0;indexFile>8),unixCompatible=versionMadeBy>>8==3,rawFilename=directoryArray.subarray(filenameOffset,extraFieldOffset),commentLength=getUint16(directoryView,offset+32),endOffset=commentOffset+commentLength,rawComment=directoryArray.subarray(commentOffset,endOffset),filenameUTF8=languageEncodingFlag,commentUTF8=languageEncodingFlag,externalFileAttributes=getUint32(directoryView,offset+38),msdosAttributesRaw=255&externalFileAttributes,msdosAttributes={readOnly:Boolean(1&msdosAttributesRaw),hidden:Boolean(2&msdosAttributesRaw),system:Boolean(4&msdosAttributesRaw),directory:Boolean(16&msdosAttributesRaw),archive:Boolean(32&msdosAttributesRaw)},offsetFileEntry=getUint32(directoryView,offset+42)+prependedDataLength,decode=getOptionValue(zipReader,options,"decodeText")||decodeText,rawFilenameEncoding=filenameUTF8?"utf-8":filenameEncoding||"cp437",rawCommentEncoding=commentUTF8?"utf-8":commentEncoding||"cp437";let filename=decode(rawFilename,rawFilenameEncoding);void 0===filename&&(filename=decodeText(rawFilename,rawFilenameEncoding));let comment=decode(rawComment,rawCommentEncoding);void 0===comment&&(comment=decodeText(rawComment,rawCommentEncoding)),Object.assign(fileEntry,{versionMadeBy:versionMadeBy,msDosCompatible:msDosCompatible,compressedSize:0,uncompressedSize:0,commentLength:commentLength,offset:offsetFileEntry,diskNumberStart:getUint16(directoryView,offset+34),internalFileAttributes:getUint16(directoryView,offset+36),externalFileAttributes:externalFileAttributes,msdosAttributesRaw:msdosAttributesRaw,msdosAttributes:msdosAttributes,rawFilename:rawFilename,filenameUTF8:filenameUTF8,commentUTF8:commentUTF8,rawExtraField:directoryArray.subarray(extraFieldOffset,commentOffset),rawComment:rawComment,filename:filename,comment:comment}),startOffset=Math.max(offsetFileEntry,startOffset),readCommonFooter(fileEntry,fileEntry,directoryView,offset+6);const unixExternalUpper=fileEntry.externalFileAttributes>>16&65535;void 0===fileEntry.unixMode&&16877&unixExternalUpper&&(fileEntry.unixMode=unixExternalUpper);const setuid=Boolean(2048&fileEntry.unixMode),setgid=Boolean(1024&fileEntry.unixMode),sticky=Boolean(512&fileEntry.unixMode),executable=void 0!==fileEntry.unixMode?!!(73&fileEntry.unixMode):unixCompatible&&!!(73&unixExternalUpper),modeIsDir=void 0!==fileEntry.unixMode&&16384==(61440&fileEntry.unixMode),upperIsDir=16384==(61440&unixExternalUpper);Object.assign(fileEntry,{setuid:setuid,setgid:setgid,sticky:sticky,unixExternalUpper:unixExternalUpper,internalFileAttribute:fileEntry.internalFileAttributes,externalFileAttribute:fileEntry.externalFileAttributes,executable:executable,directory:modeIsDir||upperIsDir||msDosCompatible&&msdosAttributes.directory||filename.endsWith("/")&&!fileEntry.uncompressedSize,zipCrypto:fileEntry.encrypted&&!fileEntry.extraFieldAES});const entry=new Entry(fileEntry);entry.getData=(writer,options)=>fileEntry.getData(writer,entry,zipReader.readRanges,options),entry.arrayBuffer=async options=>{const writer=new TransformStream,[arrayBuffer]=await Promise.all([new Response(writer.readable).arrayBuffer(),fileEntry.getData(writer,entry,zipReader.readRanges,options)]);return arrayBuffer},offset=endOffset;const{onprogress:onprogress}=options;if(onprogress)try{await onprogress(indexFile+1,filesLength,new Entry(fileEntry))}catch{}yield entry}const extractPrependedData=getOptionValue(zipReader,options,"extractPrependedData"),extractAppendedData=getOptionValue(zipReader,options,"extractAppendedData");return extractPrependedData&&(zipReader.prependedData=startOffset>0?await readUint8Array(reader,0,startOffset):new Uint8Array),zipReader.comment=commentLength?await readUint8Array(reader,commentOffset+22,commentLength):new Uint8Array,extractAppendedData&&(zipReader.appendedData=appendedDataOffset>>8&255:signature>>>24&255),outputSize:passThrough?compressedSize:uncompressedSize,signature:signature,compressed:0!=compressionMethod&&!passThrough,encrypted:zipEntry.encrypted&&!passThrough,useWebWorkers:getOptionValue(zipEntry,options,"useWebWorkers"),useCompressionStream:useCompressionStream,transferStreams:getOptionValue(zipEntry,options,"transferStreams"),deflate64:deflate64,checkPasswordOnly:checkPasswordOnly},config:config,streamOptions:{signal:signal,size:size,onstart:onstart,onprogress:onprogress,onend:onend}};let writable;checkOverlappingEntry&&await async function({reader:reader,fileEntry:fileEntry,offset:offset,diskNumberStart:diskNumberStart,signature:signature,compressedSize:compressedSize,uncompressedSize:uncompressedSize,dataOffset:dataOffset,dataDescriptor:dataDescriptor,extraFieldZip64:extraFieldZip64,readRanges:readRanges}){let diskOffset=0;if(diskNumberStart)for(let indexReader=0;indexReader=otherRange.start&&range.start>1,dataDescriptor:!(8&~rawBitFlag),languageEncodingFlag:!(2048&~rawBitFlag)},rawLastModDate:rawLastModDate,lastModDate:getDate(rawLastModDate),filenameLength:getUint16(dataView,offset+22),extraFieldLength:getUint16(dataView,offset+24)})}function readCommonFooter(fileEntry,directory,dataView,offset,localDirectory){const{rawExtraField:rawExtraField}=directory,extraField=directory.extraField=new Map,rawExtraFieldView=getDataView(new Uint8Array(rawExtraField));let offsetExtraField=0;try{for(;offsetExtraFielddirectory[propertyName]==max);for(let indexMissingProperty=0,offset=0;indexMissingProperty=5&&(timeProperties.push("lastModDate"),timeRawProperties.push("rawLastModDate"));let offset=1;timeProperties.forEach((propertyName,indexProperty)=>{if(extraFieldExtendedTimestamp.data.length>=offset+4){const time=getUint32(extraFieldView,offset);directory[propertyName]=extraFieldExtendedTimestamp[propertyName]=new Date(1e3*time);const rawPropertyName=timeRawProperties[indexProperty];extraFieldExtendedTimestamp[rawPropertyName]=time}offset+=4})}(extraFieldExtendedTimestamp,directory,localDirectory),directory.extraFieldExtendedTimestamp=extraFieldExtendedTimestamp);const extraFieldUSDZ=extraField.get(6534);extraFieldUSDZ&&(directory.extraFieldUSDZ=extraFieldUSDZ)}function readExtraFieldUnicode(extraFieldUnicode,propertyName,rawPropertyName,directory,fileEntry){const extraFieldView=getDataView(extraFieldUnicode.data),crc32=new Crc32;crc32.append(fileEntry[rawPropertyName]);const dataViewSignature=getDataView(new Uint8Array(4));dataViewSignature.setUint32(0,crc32.get(),!0);const signature=getUint32(extraFieldView,1);Object.assign(extraFieldUnicode,{version:getUint8(extraFieldView,0),[propertyName]:decodeText(extraFieldUnicode.data.subarray(5)),valid:!fileEntry.bitFlag.languageEncodingFlag&&signature==getUint32(dataViewSignature,0)}),extraFieldUnicode.valid&&(directory[propertyName]=extraFieldUnicode[propertyName],directory[propertyName+"UTF8"]=!0)}function readExtraFieldUnix(extraField,directory,isInfoZip){try{const view=getDataView(new Uint8Array(extraField.data));let offset=0;const version=getUint8(view,offset++),uidSize=getUint8(view,offset++),uidBytes=extraField.data.subarray(offset,offset+uidSize);offset+=uidSize;const uid=unpackUnixId(uidBytes),gidSize=getUint8(view,offset++),gidBytes=extraField.data.subarray(offset,offset+gidSize);offset+=gidSize;const gid=unpackUnixId(gidBytes);let unixMode;if(!isInfoZip&&offset+2<=extraField.data.length){const base=extraField.data;unixMode=new DataView(base.buffer,base.byteOffset+offset,2).getUint16(0,!0)}Object.assign(extraField,{version:version,uid:uid,gid:gid,unixMode:unixMode}),void 0!==uid&&(directory.uid=uid),void 0!==gid&&(directory.gid=gid),void 0!==unixMode&&(directory.unixMode=unixMode)}catch{}}function unpackUnixId(bytes){const buffer=new Uint8Array(4);buffer.set(bytes,0);return new DataView(buffer.buffer,buffer.byteOffset,4).getUint32(0,!0)}function getOptionValue(zipReader,options,name){return void 0===options[name]?zipReader.options[name]:options[name]}function getDate(timeRaw){const date=(4294901760&timeRaw)>>16,time=65535&timeRaw;try{return new Date(1980+((65024&date)>>9),((480&date)>>5)-1,31&date,(63488&time)>>11,(2016&time)>>5,2*(31&time),0)}catch{}}function getDateNTFS(timeRaw){return new Date(Number(timeRaw/BigInt(1e4)-BigInt(116444736e5)))}function getUint8(view,offset){return view.getUint8(offset)}function getUint16(view,offset){return view.getUint16(offset,!0)}function getUint32(view,offset){return view.getUint32(offset,!0)}function getBigUint64(view,offset){return Number(view.getBigUint64(offset,!0))}function getDataView(array){return new DataView(array.buffer)}try{configure({baseURI:import.meta.url})}catch{}const A="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";let wasm,malloc,free,memory;function _make(isCompress,type,options={}){const level="number"==typeof options.level?options.level:-1,outBufferSize="number"==typeof options.outBuffer?options.outBuffer:65536,inBufferSize="number"==typeof options.inBufferSize?options.inBufferSize:65536;return new TransformStream({start(){let result;if(this.out=malloc(outBufferSize),this.in=malloc(inBufferSize),this.inBufferSize=inBufferSize,this._scratch=new Uint8Array(outBufferSize),isCompress?(this._process=wasm.deflate_process,this._last_consumed=wasm.deflate_last_consumed,this._end=wasm.deflate_end,this.streamHandle=wasm.deflate_new(),result="gzip"===type?wasm.deflate_init_gzip(this.streamHandle,level):"deflate-raw"===type?wasm.deflate_init_raw(this.streamHandle,level):wasm.deflate_init(this.streamHandle,level)):"deflate64-raw"===type?(this._process=wasm.inflate9_process,this._last_consumed=wasm.inflate9_last_consumed,this._end=wasm.inflate9_end,this.streamHandle=wasm.inflate9_new(),result=wasm.inflate9_init_raw(this.streamHandle)):(this._process=wasm.inflate_process,this._last_consumed=wasm.inflate_last_consumed,this._end=wasm.inflate_end,this.streamHandle=wasm.inflate_new(),result="deflate-raw"===type?wasm.inflate_init_raw(this.streamHandle):"gzip"===type?wasm.inflate_init_gzip(this.streamHandle):wasm.inflate_init(this.streamHandle)),0!==result)throw new Error("init failed:"+result)},transform(chunk,controller){try{const buffer=chunk,heap=new Uint8Array(memory.buffer),process=this._process,last_consumed=this._last_consumed,out=this.out,scratch=this._scratch;let offset=0;for(;offset>24&255,signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}const consumed=last_consumed(this.streamHandle);if(0===consumed)break;offset+=consumed}}catch(error){this._end&&this.streamHandle&&this._end(this.streamHandle),this.in&&free&&free(this.in),this.out&&free&&free(this.out),controller.error(error)}},flush(controller){try{const heap=new Uint8Array(memory.buffer),process=this._process,out=this.out,scratch=this._scratch;for(;;){const result=process(this.streamHandle,0,0,out,outBufferSize,4),produced=16777215&result,code=result>>24&255;if(!isCompress){const signedCode=128&code?code-256:code;if(signedCode<0)throw new Error("process error:"+signedCode)}if(produced&&(scratch.set(heap.subarray(out,out+produced),0),controller.enqueue(scratch.slice(0,produced))),1===code||0===produced)break}}catch(error){controller.error(error)}finally{if(this._end&&this.streamHandle){const result=this._end(this.streamHandle);0!==result&&controller.error(new Error("end error:"+result))}this.in&&free&&free(this.in),this.out&&free&&free(this.out)}}})}let modulePromise,initializedModule=!1;async function initModule(wasmURI,{baseURI:baseURI}){if(!initializedModule){let arrayBuffer,uri;try{try{uri=new URL(wasmURI,baseURI)}catch{}const response=await fetch(uri);arrayBuffer=await response.arrayBuffer()}catch(error){if(!wasmURI.startsWith("data:application/wasm;base64,"))throw error;arrayBuffer=function(dataURI){const base64=dataURI.split(",")[1],binary=atob(base64),len=binary.length,bytes=new Uint8Array(len);for(let i=0;i(B||(B="data:application/wasm;base64,"+(g=>{g=(g=>{const B=(g=(g+"").replace(/[^A-Za-z0-9+/=]/g,"")).length,E=[];for(let I=0;B>I;I+=4){const B=A.indexOf(g[I])<<18|A.indexOf(g[I+1])<<12|(63&A.indexOf(g[I+2]))<<6|63&A.indexOf(g[I+3]);E.push(B>>16&255),"="!==g[I+2]&&E.push(B>>8&255),"="!==g[I+3]&&E.push(255&B)}return new Uint8Array(E)})(g);let B=new Uint8Array(1024),E=0;for(let A=0;AA;A++)B[E++]=B[o+A]}else{const Q=C;I(E+Q);for(let I=0;Q>I&&A{let B="";const E=g.length;let I=0;for(;E>I+2;I+=3){const E=g[I]<<16|g[I+1]<<8|g[I+2];B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+A[63&E]}const C=E-I;if(1===C){const E=g[I]<<16;B+=A[E>>18&63]+A[E>>12&63]+"=="}else if(2===C){const E=g[I]<<16|g[I+1]<<8;B+=A[E>>18&63]+A[E>>12&63]+A[E>>6&63]+"="}return B})(new Uint8Array(B.buffer.slice(0,E)));function I(A){if(B.lengthg;)g*=2;const I=new Uint8Array(g);I.set(B.subarray(0,E)),B=I}}})("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BAGZgAAEAVmAAAQB2YAABAE5gAAEAbmAAAQBeYAABAH5gAAEAQWAAAQBhYAABAFFgAAEAcWAAAQBJYAABAGlgAAEAWWAAAQB5YAABAEVgAAEAZWAAAQBVYAABAHVgAAEATWAAAQBtYAABAF1gAAEAfWAAAQBDYAABAGNgAAEAU2AAAQBzYAABIARMwIArYAABAFtgAAEAe2AAAQBHYAABAGdgAAEAV2AAAQB3YAABAE9gAAEAb2AAAQBfYAABAH9gAAEAROAAMIFEwEJAJOAAAgBk4AACAFTgAAIAVOAAAgB04AACAHTgAAIATOAAAgBM4AACAGzgAAIAbOAAAgBc4AACAFzgAAIAfOAAAgB84AACAELgAAIgBDagAQCgAAEgAAIAUuAAAgBS4AACAHLgAAIAcuAAAgBK4AACAErgAAIAauAAAgBq4AACAFrgAAIAWuAAAgB64AACAHrgAAIARuAAAgBG4AACAGbgAAIAZuAAAgBW4AACAFbgAAIAduAAAgB24AACAE7gAAIATuAAAgBu4AACAG7gAAIAXuAAAgBe4AACAH7gAAIAfuAAAiBA7YBB4AACAGHgAAIAYeAAAgBR4AACAFHgAAIAceAAAgBx4AACAEngAAIASeAAAgBp4AACAGngAAIAWeAAAgBZ4AACAHngAAIAeeAAAgBF4AACAEXgAAIAZeAAAgBl4AACAFXgAAIAVeAAAgB14AACAHXgAAIATeAAAgBN4AACAG3gAAIAbeAAAgBd4AACAF3gAAIAfeAAAgB94AACAEPgAAIAQ+AAAgBj4AACAGPgAAIAU+AAAgBT4AACAHPgAAIAc+AAAgBL4AACAEvgAAIAa+AAAgBr4AACAFvgAAIAW+AAAgB74AACAHvgAAIAR+AAAgBH4AACAGfgAAIAZ+AAAgBX4AACAFfgAAIAd+AAAgB34AACAE/gAAIAT+AAAgBv4AACAG/gAAIAX+AAAgBf4AACAH/gAAIAf+AAAiBBAoBQIAABAEggAAEAWCAAAQBEIAABAFQgAAEATCAAAQBcIIFVgMHAEiAAAQBKIAABAFogAAEARiAAAQBWIAABAE4gAAEAXiAAAQBBIAABAFEgAAEASSAAAQBZIAABAEUgAAEAVSAAAQBNIAABAF0gAAEAQOAAEIBg4AABAFDgAAEAcOAAAQBI4AABAGjgAAEAWOAAAQB44AABIC+K4AAdIECxgEFgABcAQWCBUoBFIAABAEMgAAEARyAAASAvlaABEQBBYIGBAEaggXqAQWAA9QBBYADuAEFgAOcgE92gAAEARGAAAQBCYAABAEZgAAEgQACARWAAAQBDYAABAEdgAAEgL59gAKkgQZAAQWAAiyBBaYBBYABtAEFgD3fAxsLTYMfuYcABIC+rooABIEHUYkABAEEjAAEAQWKAAQEQbAcC4C9CosAS40AO4UALwEGhAAEgQWIgQAEgQEKgQAEgQGSgQAEgIS2ggAEAQuEAAQBDIQABIAF24FHeQTgHQsjhQBfhQXLAhARgAVtBgcJBgoFC4A6uAQNAg4BgAclBJQeC2mFAJCFAIiFAICFAHiBAGiBAFyBBh8BEIAABAEUgAAEARiAAAQBHIAABAEggAAEASiAAAQBMIAABAE4gAAEAUCAAAQBUIAABIEGvQFwgAAEAYCAAAQBoIAABAHAgAAEAeCAAG8DHwtyjQBvgQBrgQBngQBjgQBfgQBbgQBXgQBTgQBPgQBLgQBHgQBDgQE8AYCvAEGAUc0CC22BAMcBBIAAAgEIgAAEgQEzgQJLARCAAA6DAAyBnqyAqmuEACSBB3OBAE8BCIAACIEAGIUADIEIt4MADAEggQCUgDKEgQBrAYCBCC8BBIMADIA/SAoBABAMAEGRIQv/gCUfgMDAgIKxBQgJCQoKgEk3gAABAQ2AAAEBDoAAAQEPgAABARCEAAEBEYQAAQEShAABAROEAAEBFIwAAQEVjAABARaMAAEBF4wAAQEYnAABARmcAAEBGpwAAQEbmwABARyBffsEBAQFBYHB1QEHgAABAQiEAAGAXSqCAAEBCowAAYAnsooAAYEBMJkAAYEBTJkAAYEBaLkAAYEBpLkAAYIDdYABzoUBvI0BqJ0BkLwBgAIbHLwAAQEdvAABgA9PgH05A9AqAQ==")),B)})}(configure),function({initModule:initModuleFunction}){initModule$1=initModuleFunction}({initModule:config=>{if(!modulePromise){let{wasmURI:wasmURI}=config;"function"==typeof wasmURI&&(wasmURI=wasmURI()),modulePromise=initModule(wasmURI,config)}return modulePromise}}),configure({CompressionStreamZlib:class{constructor(type="deflate",options){return _make(!0,type,options)}},DecompressionStreamZlib:class{constructor(type="deflate",options){return _make(!1,type,options)}}});const table={application:{"andrew-inset":"ez",annodex:"anx","atom+xml":"atom","atomcat+xml":"atomcat","atomserv+xml":"atomsrv",bbolin:"lin","cu-seeme":"cu","davmount+xml":"davmount",dsptype:"tsp",ecmascript:["es","ecma"],futuresplash:"spl",hta:"hta","java-archive":"jar","java-serialized-object":"ser","java-vm":"class",m3g:"m3g","mac-binhex40":"hqx",mathematica:["nb","ma","mb"],msaccess:"mdb",msword:["doc","dot","wiz"],mxf:"mxf",oda:"oda",ogg:"ogx",pdf:"pdf","pgp-keys":"key","pgp-signature":["asc","sig"],"pics-rules":"prf",postscript:["ps","ai","eps","epsi","epsf","eps2","eps3"],rar:"rar","rdf+xml":"rdf","rss+xml":"rss",rtf:"rtf","xhtml+xml":["xhtml","xht"],xml:["xml","xsl","xsd","xpdl"],"xspf+xml":"xspf",zip:"zip","vnd.android.package-archive":"apk","vnd.cinderella":"cdy","vnd.google-earth.kml+xml":"kml","vnd.google-earth.kmz":"kmz","vnd.mozilla.xul+xml":"xul","vnd.ms-excel":["xls","xlb","xlt","xlm","xla","xlc","xlw"],"vnd.ms-pki.seccat":"cat","vnd.ms-pki.stl":"stl","vnd.ms-powerpoint":["ppt","pps","pot","ppa","pwz"],"vnd.oasis.opendocument.chart":"odc","vnd.oasis.opendocument.database":"odb","vnd.oasis.opendocument.formula":"odf","vnd.oasis.opendocument.graphics":"odg","vnd.oasis.opendocument.graphics-template":"otg","vnd.oasis.opendocument.image":"odi","vnd.oasis.opendocument.presentation":"odp","vnd.oasis.opendocument.presentation-template":"otp","vnd.oasis.opendocument.spreadsheet":"ods","vnd.oasis.opendocument.spreadsheet-template":"ots","vnd.oasis.opendocument.text":"odt","vnd.oasis.opendocument.text-master":["odm","otm"],"vnd.oasis.opendocument.text-template":"ott","vnd.oasis.opendocument.text-web":"oth","vnd.openxmlformats-officedocument.spreadsheetml.sheet":"xlsx","vnd.openxmlformats-officedocument.spreadsheetml.template":"xltx","vnd.openxmlformats-officedocument.presentationml.presentation":"pptx","vnd.openxmlformats-officedocument.presentationml.slideshow":"ppsx","vnd.openxmlformats-officedocument.presentationml.template":"potx","vnd.openxmlformats-officedocument.wordprocessingml.document":"docx","vnd.openxmlformats-officedocument.wordprocessingml.template":"dotx","vnd.smaf":"mmf","vnd.stardivision.calc":"sdc","vnd.stardivision.chart":"sds","vnd.stardivision.draw":"sda","vnd.stardivision.impress":"sdd","vnd.stardivision.math":["sdf","smf"],"vnd.stardivision.writer":["sdw","vor"],"vnd.stardivision.writer-global":"sgl","vnd.sun.xml.calc":"sxc","vnd.sun.xml.calc.template":"stc","vnd.sun.xml.draw":"sxd","vnd.sun.xml.draw.template":"std","vnd.sun.xml.impress":"sxi","vnd.sun.xml.impress.template":"sti","vnd.sun.xml.math":"sxm","vnd.sun.xml.writer":"sxw","vnd.sun.xml.writer.global":"sxg","vnd.sun.xml.writer.template":"stw","vnd.symbian.install":["sis","sisx"],"vnd.visio":["vsd","vst","vss","vsw","vsdx","vssx","vstx","vssm","vstm"],"vnd.wap.wbxml":"wbxml","vnd.wap.wmlc":"wmlc","vnd.wap.wmlscriptc":"wmlsc","vnd.wordperfect":"wpd","vnd.wordperfect5.1":"wp5","x-123":"wk","x-7z-compressed":"7z","x-abiword":"abw","x-apple-diskimage":"dmg","x-bcpio":"bcpio","x-bittorrent":"torrent","x-cbr":["cbr","cba","cbt","cb7"],"x-cbz":"cbz","x-cdf":["cdf","cda"],"x-cdlink":"vcd","x-chess-pgn":"pgn","x-cpio":"cpio","x-csh":"csh","x-director":["dir","dxr","cst","cct","cxt","w3d","fgd","swa"],"x-dms":"dms","x-doom":"wad","x-dvi":"dvi","x-httpd-eruby":"rhtml","x-font":"pcf.Z","x-freemind":"mm","x-gnumeric":"gnumeric","x-go-sgf":"sgf","x-graphing-calculator":"gcf","x-gtar":["gtar","taz"],"x-hdf":"hdf","x-httpd-php":["phtml","pht","php"],"x-httpd-php-source":"phps","x-httpd-php3":"php3","x-httpd-php3-preprocessed":"php3p","x-httpd-php4":"php4","x-httpd-php5":"php5","x-ica":"ica","x-info":"info","x-internet-signup":["ins","isp"],"x-iphone":"iii","x-iso9660-image":"iso","x-java-jnlp-file":"jnlp","x-jmol":"jmz","x-killustrator":"kil","x-latex":"latex","x-lyx":"lyx","x-lzx":"lzx","x-maker":["frm","fb","fbdoc"],"x-ms-wmd":"wmd","x-msdos-program":["com","exe","bat","dll"],"x-netcdf":["nc"],"x-ns-proxy-autoconfig":["pac","dat"],"x-nwc":"nwc","x-object":"o","x-oz-application":"oza","x-pkcs7-certreqresp":"p7r","x-python-code":["pyc","pyo"],"x-qgis":["qgs","shp","shx"],"x-quicktimeplayer":"qtl","x-redhat-package-manager":["rpm","rpa"],"x-ruby":"rb","x-sh":"sh","x-shar":"shar","x-shockwave-flash":["swf","swfl"],"x-silverlight":"scr","x-stuffit":"sit","x-sv4cpio":"sv4cpio","x-sv4crc":"sv4crc","x-tar":"tar","x-tex-gf":"gf","x-tex-pk":"pk","x-texinfo":["texinfo","texi"],"x-trash":["~","%","bak","old","sik"],"x-ustar":"ustar","x-wais-source":"src","x-wingz":"wz","x-x509-ca-cert":["crt","der","cer"],"x-xcf":"xcf","x-xfig":"fig","x-xpinstall":"xpi",applixware:"aw","atomsvc+xml":"atomsvc","ccxml+xml":"ccxml","cdmi-capability":"cdmia","cdmi-container":"cdmic","cdmi-domain":"cdmid","cdmi-object":"cdmio","cdmi-queue":"cdmiq","docbook+xml":"dbk","dssc+der":"dssc","dssc+xml":"xdssc","emma+xml":"emma","epub+zip":"epub",exi:"exi","font-tdpfr":"pfr","gml+xml":"gml","gpx+xml":"gpx",gxf:"gxf",hyperstudio:"stk","inkml+xml":["ink","inkml"],ipfix:"ipfix","jsonml+json":"jsonml","lost+xml":"lostxml","mads+xml":"mads",marc:"mrc","marcxml+xml":"mrcx","mathml+xml":["mathml","mml"],mbox:"mbox","mediaservercontrol+xml":"mscml","metalink+xml":"metalink","metalink4+xml":"meta4","mets+xml":"mets","mods+xml":"mods",mp21:["m21","mp21"],mp4:"mp4s","oebps-package+xml":"opf","omdoc+xml":"omdoc",onenote:["onetoc","onetoc2","onetmp","onepkg"],oxps:"oxps","patch-ops-error+xml":"xer","pgp-encrypted":"pgp",pkcs10:"p10","pkcs7-mime":["p7m","p7c"],"pkcs7-signature":"p7s",pkcs8:"p8","pkix-attr-cert":"ac","pkix-crl":"crl","pkix-pkipath":"pkipath",pkixcmp:"pki","pls+xml":"pls","prs.cww":"cww","pskc+xml":"pskcxml","reginfo+xml":"rif","relax-ng-compact-syntax":"rnc","resource-lists+xml":"rl","resource-lists-diff+xml":"rld","rls-services+xml":"rs","rpki-ghostbusters":"gbr","rpki-manifest":"mft","rpki-roa":"roa","rsd+xml":"rsd","sbml+xml":"sbml","scvp-cv-request":"scq","scvp-cv-response":"scs","scvp-vp-request":"spq","scvp-vp-response":"spp",sdp:"sdp","set-payment-initiation":"setpay","set-registration-initiation":"setreg","shf+xml":"shf","sparql-query":"rq","sparql-results+xml":"srx",srgs:"gram","srgs+xml":"grxml","sru+xml":"sru","ssdl+xml":"ssdl","ssml+xml":"ssml","tei+xml":["tei","teicorpus"],"thraud+xml":"tfi","timestamped-data":"tsd","vnd.3gpp.pic-bw-large":"plb","vnd.3gpp.pic-bw-small":"psb","vnd.3gpp.pic-bw-var":"pvb","vnd.3gpp2.tcap":"tcap","vnd.3m.post-it-notes":"pwn","vnd.accpac.simply.aso":"aso","vnd.accpac.simply.imp":"imp","vnd.acucobol":"acu","vnd.acucorp":["atc","acutc"],"vnd.adobe.air-application-installer-package+zip":"air","vnd.adobe.formscentral.fcdt":"fcdt","vnd.adobe.fxp":["fxp","fxpl"],"vnd.adobe.xdp+xml":"xdp","vnd.adobe.xfdf":"xfdf","vnd.ahead.space":"ahead","vnd.airzip.filesecure.azf":"azf","vnd.airzip.filesecure.azs":"azs","vnd.amazon.ebook":"azw","vnd.americandynamics.acc":"acc","vnd.amiga.ami":"ami","vnd.anser-web-certificate-issue-initiation":"cii","vnd.anser-web-funds-transfer-initiation":"fti","vnd.antix.game-component":"atx","vnd.apple.installer+xml":"mpkg","vnd.apple.mpegurl":"m3u8","vnd.aristanetworks.swi":"swi","vnd.astraea-software.iota":"iota","vnd.audiograph":"aep","vnd.blueice.multipass":"mpm","vnd.bmi":"bmi","vnd.businessobjects":"rep","vnd.chemdraw+xml":"cdxml","vnd.chipnuts.karaoke-mmd":"mmd","vnd.claymore":"cla","vnd.cloanto.rp9":"rp9","vnd.clonk.c4group":["c4g","c4d","c4f","c4p","c4u"],"vnd.cluetrust.cartomobile-config":"c11amc","vnd.cluetrust.cartomobile-config-pkg":"c11amz","vnd.commonspace":"csp","vnd.contact.cmsg":"cdbcmsg","vnd.cosmocaller":"cmc","vnd.crick.clicker":"clkx","vnd.crick.clicker.keyboard":"clkk","vnd.crick.clicker.palette":"clkp","vnd.crick.clicker.template":"clkt","vnd.crick.clicker.wordbank":"clkw","vnd.criticaltools.wbs+xml":"wbs","vnd.ctc-posml":"pml","vnd.cups-ppd":"ppd","vnd.curl.car":"car","vnd.curl.pcurl":"pcurl","vnd.dart":"dart","vnd.data-vision.rdz":"rdz","vnd.dece.data":["uvf","uvvf","uvd","uvvd"],"vnd.dece.ttml+xml":["uvt","uvvt"],"vnd.dece.unspecified":["uvx","uvvx"],"vnd.dece.zip":["uvz","uvvz"],"vnd.denovo.fcselayout-link":"fe_launch","vnd.dna":"dna","vnd.dolby.mlp":"mlp","vnd.dpgraph":"dpg","vnd.dreamfactory":"dfac","vnd.ds-keypoint":"kpxx","vnd.dvb.ait":"ait","vnd.dvb.service":"svc","vnd.dynageo":"geo","vnd.ecowin.chart":"mag","vnd.enliven":"nml","vnd.epson.esf":"esf","vnd.epson.msf":"msf","vnd.epson.quickanime":"qam","vnd.epson.salt":"slt","vnd.epson.ssf":"ssf","vnd.eszigno3+xml":["es3","et3"],"vnd.ezpix-album":"ez2","vnd.ezpix-package":"ez3","vnd.fdf":"fdf","vnd.fdsn.mseed":"mseed","vnd.fdsn.seed":["seed","dataless"],"vnd.flographit":"gph","vnd.fluxtime.clip":"ftc","vnd.framemaker":["fm","frame","maker","book"],"vnd.frogans.fnc":"fnc","vnd.frogans.ltf":"ltf","vnd.fsc.weblaunch":"fsc","vnd.fujitsu.oasys":"oas","vnd.fujitsu.oasys2":"oa2","vnd.fujitsu.oasys3":"oa3","vnd.fujitsu.oasysgp":"fg5","vnd.fujitsu.oasysprs":"bh2","vnd.fujixerox.ddd":"ddd","vnd.fujixerox.docuworks":"xdw","vnd.fujixerox.docuworks.binder":"xbd","vnd.fuzzysheet":"fzs","vnd.genomatix.tuxedo":"txd","vnd.geogebra.file":"ggb","vnd.geogebra.tool":"ggt","vnd.geometry-explorer":["gex","gre"],"vnd.geonext":"gxt","vnd.geoplan":"g2w","vnd.geospace":"g3w","vnd.gmx":"gmx","vnd.grafeq":["gqf","gqs"],"vnd.groove-account":"gac","vnd.groove-help":"ghf","vnd.groove-identity-message":"gim","vnd.groove-injector":"grv","vnd.groove-tool-message":"gtm","vnd.groove-tool-template":"tpl","vnd.groove-vcard":"vcg","vnd.hal+xml":"hal","vnd.handheld-entertainment+xml":"zmm","vnd.hbci":"hbci","vnd.hhe.lesson-player":"les","vnd.hp-hpgl":"hpgl","vnd.hp-hpid":"hpid","vnd.hp-hps":"hps","vnd.hp-jlyt":"jlt","vnd.hp-pcl":"pcl","vnd.hp-pclxl":"pclxl","vnd.hydrostatix.sof-data":"sfd-hdstx","vnd.ibm.minipay":"mpy","vnd.ibm.modcap":["afp","listafp","list3820"],"vnd.ibm.rights-management":"irm","vnd.ibm.secure-container":"sc","vnd.iccprofile":["icc","icm"],"vnd.igloader":"igl","vnd.immervision-ivp":"ivp","vnd.immervision-ivu":"ivu","vnd.insors.igm":"igm","vnd.intercon.formnet":["xpw","xpx"],"vnd.intergeo":"i2g","vnd.intu.qbo":"qbo","vnd.intu.qfx":"qfx","vnd.ipunplugged.rcprofile":"rcprofile","vnd.irepository.package+xml":"irp","vnd.is-xpr":"xpr","vnd.isac.fcs":"fcs","vnd.jam":"jam","vnd.jcp.javame.midlet-rms":"rms","vnd.jisp":"jisp","vnd.joost.joda-archive":"joda","vnd.kahootz":["ktz","ktr"],"vnd.kde.karbon":"karbon","vnd.kde.kchart":"chrt","vnd.kde.kformula":"kfo","vnd.kde.kivio":"flw","vnd.kde.kontour":"kon","vnd.kde.kpresenter":["kpr","kpt"],"vnd.kde.kspread":"ksp","vnd.kde.kword":["kwd","kwt"],"vnd.kenameaapp":"htke","vnd.kidspiration":"kia","vnd.kinar":["kne","knp"],"vnd.koan":["skp","skd","skt","skm"],"vnd.kodak-descriptor":"sse","vnd.las.las+xml":"lasxml","vnd.llamagraphics.life-balance.desktop":"lbd","vnd.llamagraphics.life-balance.exchange+xml":"lbe","vnd.lotus-1-2-3":"123","vnd.lotus-approach":"apr","vnd.lotus-freelance":"pre","vnd.lotus-notes":"nsf","vnd.lotus-organizer":"org","vnd.lotus-screencam":"scm","vnd.lotus-wordpro":"lwp","vnd.macports.portpkg":"portpkg","vnd.mcd":"mcd","vnd.medcalcdata":"mc1","vnd.mediastation.cdkey":"cdkey","vnd.mfer":"mwf","vnd.mfmp":"mfm","vnd.micrografx.flo":"flo","vnd.micrografx.igx":"igx","vnd.mif":"mif","vnd.mobius.daf":"daf","vnd.mobius.dis":"dis","vnd.mobius.mbk":"mbk","vnd.mobius.mqy":"mqy","vnd.mobius.msl":"msl","vnd.mobius.plc":"plc","vnd.mobius.txf":"txf","vnd.mophun.application":"mpn","vnd.mophun.certificate":"mpc","vnd.ms-artgalry":"cil","vnd.ms-cab-compressed":"cab","vnd.ms-excel.addin.macroenabled.12":"xlam","vnd.ms-excel.sheet.binary.macroenabled.12":"xlsb","vnd.ms-excel.sheet.macroenabled.12":"xlsm","vnd.ms-excel.template.macroenabled.12":"xltm","vnd.ms-fontobject":"eot","vnd.ms-htmlhelp":"chm","vnd.ms-ims":"ims","vnd.ms-lrm":"lrm","vnd.ms-officetheme":"thmx","vnd.ms-powerpoint.addin.macroenabled.12":"ppam","vnd.ms-powerpoint.presentation.macroenabled.12":"pptm","vnd.ms-powerpoint.slide.macroenabled.12":"sldm","vnd.ms-powerpoint.slideshow.macroenabled.12":"ppsm","vnd.ms-powerpoint.template.macroenabled.12":"potm","vnd.ms-project":["mpp","mpt"],"vnd.ms-word.document.macroenabled.12":"docm","vnd.ms-word.template.macroenabled.12":"dotm","vnd.ms-works":["wps","wks","wcm","wdb"],"vnd.ms-wpl":"wpl","vnd.ms-xpsdocument":"xps","vnd.mseq":"mseq","vnd.musician":"mus","vnd.muvee.style":"msty","vnd.mynfc":"taglet","vnd.neurolanguage.nlu":"nlu","vnd.nitf":["ntf","nitf"],"vnd.noblenet-directory":"nnd","vnd.noblenet-sealer":"nns","vnd.noblenet-web":"nnw","vnd.nokia.n-gage.data":"ngdat","vnd.nokia.n-gage.symbian.install":"n-gage","vnd.nokia.radio-preset":"rpst","vnd.nokia.radio-presets":"rpss","vnd.novadigm.edm":"edm","vnd.novadigm.edx":"edx","vnd.novadigm.ext":"ext","vnd.oasis.opendocument.chart-template":"otc","vnd.oasis.opendocument.formula-template":"odft","vnd.oasis.opendocument.image-template":"oti","vnd.olpc-sugar":"xo","vnd.oma.dd2+xml":"dd2","vnd.openofficeorg.extension":"oxt","vnd.openxmlformats-officedocument.presentationml.slide":"sldx","vnd.osgeo.mapguide.package":"mgp","vnd.osgi.dp":"dp","vnd.osgi.subsystem":"esa","vnd.palm":["pdb","pqa","oprc"],"vnd.pawaafile":"paw","vnd.pg.format":"str","vnd.pg.osasli":"ei6","vnd.picsel":"efif","vnd.pmi.widget":"wg","vnd.pocketlearn":"plf","vnd.powerbuilder6":"pbd","vnd.previewsystems.box":"box","vnd.proteus.magazine":"mgz","vnd.publishare-delta-tree":"qps","vnd.pvi.ptid1":"ptid","vnd.quark.quarkxpress":["qxd","qxt","qwd","qwt","qxl","qxb"],"vnd.realvnc.bed":"bed","vnd.recordare.musicxml":"mxl","vnd.recordare.musicxml+xml":"musicxml","vnd.rig.cryptonote":"cryptonote","vnd.rn-realmedia":"rm","vnd.rn-realmedia-vbr":"rmvb","vnd.route66.link66+xml":"link66","vnd.sailingtracker.track":"st","vnd.seemail":"see","vnd.sema":"sema","vnd.semd":"semd","vnd.semf":"semf","vnd.shana.informed.formdata":"ifm","vnd.shana.informed.formtemplate":"itp","vnd.shana.informed.interchange":"iif","vnd.shana.informed.package":"ipk","vnd.simtech-mindmapper":["twd","twds"],"vnd.smart.teacher":"teacher","vnd.solent.sdkm+xml":["sdkm","sdkd"],"vnd.spotfire.dxp":"dxp","vnd.spotfire.sfs":"sfs","vnd.stepmania.package":"smzip","vnd.stepmania.stepchart":"sm","vnd.sus-calendar":["sus","susp"],"vnd.svd":"svd","vnd.syncml+xml":"xsm","vnd.syncml.dm+wbxml":"bdm","vnd.syncml.dm+xml":"xdm","vnd.tao.intent-module-archive":"tao","vnd.tcpdump.pcap":["pcap","cap","dmp"],"vnd.tmobile-livetv":"tmo","vnd.trid.tpt":"tpt","vnd.triscape.mxs":"mxs","vnd.trueapp":"tra","vnd.ufdl":["ufd","ufdl"],"vnd.uiq.theme":"utz","vnd.umajin":"umj","vnd.unity":"unityweb","vnd.uoml+xml":"uoml","vnd.vcx":"vcx","vnd.visionary":"vis","vnd.vsf":"vsf","vnd.webturbo":"wtb","vnd.wolfram.player":"nbp","vnd.wqd":"wqd","vnd.wt.stf":"stf","vnd.xara":"xar","vnd.xfdl":"xfdl","vnd.yamaha.hv-dic":"hvd","vnd.yamaha.hv-script":"hvs","vnd.yamaha.hv-voice":"hvp","vnd.yamaha.openscoreformat":"osf","vnd.yamaha.openscoreformat.osfpvg+xml":"osfpvg","vnd.yamaha.smaf-audio":"saf","vnd.yamaha.smaf-phrase":"spf","vnd.yellowriver-custom-menu":"cmp","vnd.zul":["zir","zirz"],"vnd.zzazz.deck+xml":"zaz","voicexml+xml":"vxml",widget:"wgt",winhlp:"hlp","wsdl+xml":"wsdl","wspolicy+xml":"wspolicy","x-ace-compressed":"ace","x-authorware-bin":["aab","x32","u32","vox"],"x-authorware-map":"aam","x-authorware-seg":"aas","x-blorb":["blb","blorb"],"x-bzip":"bz","x-bzip2":["bz2","boz"],"x-cfs-compressed":"cfs","x-chat":"chat","x-conference":"nsc","x-dgc-compressed":"dgc","x-dtbncx+xml":"ncx","x-dtbook+xml":"dtb","x-dtbresource+xml":"res","x-eva":"eva","x-font-bdf":"bdf","x-font-ghostscript":"gsf","x-font-linux-psf":"psf","x-font-pcf":"pcf","x-font-snf":"snf","x-font-ttf":["ttf","ttc"],"x-font-type1":["pfa","pfb","pfm","afm"],"x-freearc":"arc","x-gca-compressed":"gca","x-glulx":"ulx","x-gramps-xml":"gramps","x-install-instructions":"install","x-lzh-compressed":["lzh","lha"],"x-mie":"mie","x-mobipocket-ebook":["prc","mobi"],"x-ms-application":"application","x-ms-shortcut":"lnk","x-ms-xbap":"xbap","x-msbinder":"obd","x-mscardfile":"crd","x-msclip":"clp","application/x-ms-installer":"msi","x-msmediaview":["mvb","m13","m14"],"x-msmetafile":["wmf","wmz","emf","emz"],"x-msmoney":"mny","x-mspublisher":"pub","x-msschedule":"scd","x-msterminal":"trm","x-mswrite":"wri","x-nzb":"nzb","x-pkcs12":["p12","pfx"],"x-pkcs7-certificates":["p7b","spc"],"x-research-info-systems":"ris","x-silverlight-app":"xap","x-sql":"sql","x-stuffitx":"sitx","x-subrip":"srt","x-t3vm-image":"t3","x-tex-tfm":"tfm","x-tgif":"obj","x-xliff+xml":"xlf","x-xz":"xz","x-zmachine":["z1","z2","z3","z4","z5","z6","z7","z8"],"xaml+xml":"xaml","xcap-diff+xml":"xdf","xenc+xml":"xenc","xml-dtd":"dtd","xop+xml":"xop","xproc+xml":"xpl","xslt+xml":"xslt","xv+xml":["mxml","xhvml","xvml","xvm"],yang:"yang","yin+xml":"yin",envoy:"evy",fractals:"fif","internet-property-stream":"acx",olescript:"axs","vnd.ms-outlook":"msg","vnd.ms-pkicertstore":"sst","x-compress":"z","x-perfmon":["pma","pmc","pmr","pmw"],"ynd.ms-pkipko":"pko",gzip:["gz","tgz"],"smil+xml":["smi","smil"],"vnd.debian.binary-package":["deb","udeb"],"vnd.hzn-3d-crossword":"x3d","vnd.sqlite3":["db","sqlite","sqlite3","db-wal","sqlite-wal","db-shm","sqlite-shm"],"vnd.wap.sic":"sic","vnd.wap.slc":"slc","x-krita":["kra","krz"],"x-perl":["pm","pl"],yaml:["yaml","yml"]},audio:{amr:"amr","amr-wb":"awb",annodex:"axa",basic:["au","snd"],flac:"flac",midi:["mid","midi","kar","rmi"],mpeg:["mpga","mpega","mp3","m4a","mp2a","m2a","m3a"],mpegurl:"m3u",ogg:["oga","ogg","spx"],"prs.sid":"sid","x-aiff":"aifc","x-gsm":"gsm","x-ms-wma":"wma","x-ms-wax":"wax","x-pn-realaudio":"ram","x-realaudio":"ra","x-sd2":"sd2",adpcm:"adp",mp4:"mp4a",s3m:"s3m",silk:"sil","vnd.dece.audio":["uva","uvva"],"vnd.digital-winds":"eol","vnd.dra":"dra","vnd.dts":"dts","vnd.dts.hd":"dtshd","vnd.lucent.voice":"lvp","vnd.ms-playready.media.pya":"pya","vnd.nuera.ecelp4800":"ecelp4800","vnd.nuera.ecelp7470":"ecelp7470","vnd.nuera.ecelp9600":"ecelp9600","vnd.rip":"rip",webm:"weba","x-caf":"caf","x-matroska":"mka","x-pn-realaudio-plugin":"rmp",xm:"xm",aac:"aac",aiff:["aiff","aif","aff"],opus:"opus",wav:"wav"},chemical:{"x-alchemy":"alc","x-cache":["cac","cache"],"x-cache-csf":"csf","x-cactvs-binary":["cbin","cascii","ctab"],"x-cdx":"cdx","x-chem3d":"c3d","x-cif":"cif","x-cmdf":"cmdf","x-cml":"cml","x-compass":"cpa","x-crossfire":"bsd","x-csml":["csml","csm"],"x-ctx":"ctx","x-cxf":["cxf","cef"],"x-embl-dl-nucleotide":["emb","embl"],"x-gamess-input":["inp","gam","gamin"],"x-gaussian-checkpoint":["fch","fchk"],"x-gaussian-cube":"cub","x-gaussian-input":["gau","gjc","gjf"],"x-gaussian-log":"gal","x-gcg8-sequence":"gcg","x-genbank":"gen","x-hin":"hin","x-isostar":["istr","ist"],"x-jcamp-dx":["jdx","dx"],"x-kinemage":"kin","x-macmolecule":"mcm","x-macromodel-input":"mmod","x-mdl-molfile":"mol","x-mdl-rdfile":"rd","x-mdl-rxnfile":"rxn","x-mdl-sdfile":"sd","x-mdl-tgf":"tgf","x-mmcif":"mcif","x-mol2":"mol2","x-molconn-Z":"b","x-mopac-graph":"gpt","x-mopac-input":["mop","mopcrt","zmt"],"x-mopac-out":"moo","x-ncbi-asn1":"asn","x-ncbi-asn1-ascii":["prt","ent"],"x-ncbi-asn1-binary":"val","x-rosdal":"ros","x-swissprot":"sw","x-vamas-iso14976":"vms","x-vmd":"vmd","x-xtel":"xtel","x-xyz":"xyz"},font:{otf:"otf",woff:"woff",woff2:"woff2"},image:{gif:"gif",ief:"ief",jpeg:["jpeg","jpg","jpe","jfif","jfif-tbnl","jif"],pcx:"pcx",png:"png","svg+xml":["svg","svgz"],tiff:["tiff","tif"],"vnd.djvu":["djvu","djv"],"vnd.wap.wbmp":"wbmp","x-canon-cr2":"cr2","x-canon-crw":"crw","x-cmu-raster":"ras","x-coreldraw":"cdr","x-coreldrawpattern":"pat","x-coreldrawtemplate":"cdt","x-corelphotopaint":"cpt","x-epson-erf":"erf","x-icon":"ico","x-jg":"art","x-jng":"jng","x-nikon-nef":"nef","x-olympus-orf":"orf","x-portable-anymap":"pnm","x-portable-bitmap":"pbm","x-portable-graymap":"pgm","x-portable-pixmap":"ppm","x-rgb":"rgb","x-xbitmap":"xbm","x-xpixmap":"xpm","x-xwindowdump":"xwd",bmp:"bmp",cgm:"cgm",g3fax:"g3",ktx:"ktx","prs.btif":"btif",sgi:"sgi","vnd.dece.graphic":["uvi","uvvi","uvg","uvvg"],"vnd.dwg":"dwg","vnd.dxf":"dxf","vnd.fastbidsheet":"fbs","vnd.fpx":"fpx","vnd.fst":"fst","vnd.fujixerox.edmics-mmr":"mmr","vnd.fujixerox.edmics-rlc":"rlc","vnd.ms-modi":"mdi","vnd.ms-photo":"wdp","vnd.net-fpx":"npx","vnd.xiff":"xif",webp:"webp","x-3ds":"3ds","x-cmx":"cmx","x-freehand":["fh","fhc","fh4","fh5","fh7"],"x-pict":["pic","pct"],"x-tga":"tga","cis-cod":"cod",avif:"avifs",heic:["heif","heic"],pjpeg:["pjpg"],"vnd.adobe.photoshop":"psd","x-adobe-dng":"dng","x-fuji-raf":"raf","x-icns":"icns","x-kodak-dcr":"dcr","x-kodak-k25":"k25","x-kodak-kdc":"kdc","x-minolta-mrw":"mrw","x-panasonic-raw":["raw","rw2","rwl"],"x-pentax-pef":["pef","ptx"],"x-sigma-x3f":"x3f","x-sony-arw":"arw","x-sony-sr2":"sr2","x-sony-srf":"srf"},message:{rfc822:["eml","mime","mht","mhtml","nws"]},model:{iges:["igs","iges"],mesh:["msh","mesh","silo"],vrml:["wrl","vrml"],"x3d+vrml":["x3dv","x3dvz"],"x3d+xml":"x3dz","x3d+binary":["x3db","x3dbz"],"vnd.collada+xml":"dae","vnd.dwf":"dwf","vnd.gdl":"gdl","vnd.gtw":"gtw","vnd.mts":"mts","vnd.usdz+zip":"usdz","vnd.vtu":"vtu"},text:{"cache-manifest":["manifest","appcache"],calendar:["ics","icz","ifb"],css:"css",csv:"csv",h323:"323",html:["html","htm","shtml","stm"],iuls:"uls",plain:["txt","text","brf","conf","def","list","log","in","bas","diff","ksh"],richtext:"rtx",scriptlet:["sct","wsc"],texmacs:"tm","tab-separated-values":"tsv","vnd.sun.j2me.app-descriptor":"jad","vnd.wap.wml":"wml","vnd.wap.wmlscript":"wmls","x-bibtex":"bib","x-boo":"boo","x-c++hdr":["h++","hpp","hxx","hh"],"x-c++src":["c++","cpp","cxx","cc"],"x-component":"htc","x-dsrc":"d","x-diff":"patch","x-haskell":"hs","x-java":"java","x-literate-haskell":"lhs","x-moc":"moc","x-pascal":["p","pas","pp","inc"],"x-pcs-gcd":"gcd","x-python":"py","x-scala":"scala","x-setext":"etx","x-tcl":["tcl","tk"],"x-tex":["tex","ltx","sty","cls"],"x-vcalendar":"vcs","x-vcard":"vcf",n3:"n3","prs.lines.tag":"dsc",sgml:["sgml","sgm"],troff:["t","tr","roff","man","me","ms"],turtle:"ttl","uri-list":["uri","uris","urls"],vcard:"vcard","vnd.curl":"curl","vnd.curl.dcurl":"dcurl","vnd.curl.scurl":"scurl","vnd.curl.mcurl":"mcurl","vnd.dvb.subtitle":"sub","vnd.fly":"fly","vnd.fmi.flexstor":"flx","vnd.graphviz":"gv","vnd.in3d.3dml":"3dml","vnd.in3d.spot":"spot","x-asm":["s","asm"],"x-c":["c","h","dic"],"x-fortran":["f","for","f77","f90"],"x-opml":"opml","x-nfo":"nfo","x-sfv":"sfv","x-uuencode":"uu",webviewhtml:"htt",javascript:"js",json:"json",markdown:["md","markdown","mdown","markdn"],"vnd.wap.si":"si","vnd.wap.sl":"sl"},video:{avif:"avif","3gpp":"3gp",annodex:"axv",dl:"dl",dv:["dif","dv"],fli:"fli",gl:"gl",mpeg:["mpeg","mpg","mpe","m1v","m2v","mp2","mpa","mpv2"],mp4:["mp4","mp4v","mpg4"],quicktime:["qt","mov"],ogg:"ogv","vnd.mpegurl":["mxu","m4u"],"x-flv":"flv","x-la-asf":["lsf","lsx"],"x-mng":"mng","x-ms-asf":["asf","asx","asr"],"x-ms-wm":"wm","x-ms-wmv":"wmv","x-ms-wmx":"wmx","x-ms-wvx":"wvx","x-msvideo":"avi","x-sgi-movie":"movie","x-matroska":["mpv","mkv","mk3d","mks"],"3gpp2":"3g2",h261:"h261",h263:"h263",h264:"h264",jpeg:"jpgv",jpm:["jpm","jpgm"],mj2:["mj2","mjp2"],"vnd.dece.hd":["uvh","uvvh"],"vnd.dece.mobile":["uvm","uvvm"],"vnd.dece.pd":["uvp","uvvp"],"vnd.dece.sd":["uvs","uvvs"],"vnd.dece.video":["uvv","uvvv"],"vnd.dvb.file":"dvb","vnd.fvt":"fvt","vnd.ms-playready.media.pyv":"pyv","vnd.uvvu.mp4":["uvu","uvvu"],"vnd.vivo":"viv",webm:"webm","x-f4v":"f4v","x-m4v":"m4v","x-ms-vob":"vob","x-smv":"smv",mp2t:"ts"},"x-conference":{"x-cooltalk":"ice"},"x-world":{"x-vrml":["vrm","flr","wrz","xaf","xof"]}};(()=>{const mimeTypes={};for(const type of Object.keys(table))for(const subtype of Object.keys(table[type])){const value=table[type][subtype];if("string"==typeof value)mimeTypes[value]=type+"/"+subtype;else for(let indexMimeType=0;indexMimeType{const n="text/javascript";if(t){const t=new Blob([e],{type:n});return URL.createObjectURL(t)}return"data:"+n+","+encodeURIComponent(e)}})}(configure);class EpubRender extends GeneralRender{constructor(epubBuffer,config){super(Object.assign(Object.assign({},config),{format:"EPUB"})),this.epubBuffer=epubBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){let blob=new Blob([this.epubBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});try{const loader=yield this.makeZipLoader(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV3(file);this.book=yield new EPUB(loader).init()}catch(error){console.error(error);try{const loader=yield this.makeZipLoaderV2(file);this.book=yield new EPUB(loader).init()}catch(error){throw console.error(error),error}}}})}preCache(){return __awaiter(this,void 0,void 0,function*(){try{return this.book||(yield this.parse()),yield getCache(this.book)}catch(error){return""}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||0}}})}makeZipLoaderV2(file){return __awaiter(this,void 0,void 0,function*(){let zip=function(buffer){const unzipper=new fflate.Unzip,files={};unzipper.onfile=file=>{if(file.name.endsWith("/")||0===file.originalSize)return;const chunks=[];file.ondata=(err,data,final)=>{if(err)console.warn(`Error in file "${file.name}": ${err.message}`);else if(chunks.push(data),final){const content=new Uint8Array(chunks.reduce((acc,chunk)=>acc+chunk.length,0));let offset=0;chunks.forEach(chunk=>{content.set(chunk,offset),offset+=chunk.length}),files[file.name]=content}};try{file.start()}catch(error){console.warn(`Error starting file "${file.name}": ${error.message}`)}},unzipper.register(fflate.UnzipInflate);try{unzipper.push(new Uint8Array(buffer),!0)}catch(error){console.warn(`Error during unzip: ${error.message}, returning partial results`)}return files}(yield file.arrayBuffer());return{entries:Object.keys(zip).map(item=>({filename:item})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];if(entry){return new TextDecoder("utf-8").decode(entry)}return""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip[name];return entry?new Blob([entry]):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip[name];if(entry)return entry.length||0}}})}makeZipLoaderV3(file){return __awaiter(this,void 0,void 0,function*(){let zipReader=new ZipReader(new BlobReader(file)),entries=yield zipReader.getEntries();return{entries:entries.map(item=>({filename:item.filename})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new TextWriter("utf-8")):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.filename===name);return entry?yield entry.getData(new BlobWriter):new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.filename===name);if(entry)return entry.uncompressedSize||0}}})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error,"error"),error}})}}const unescapeHTML=str=>{if(!str)return"";const textarea=document.createElement("textarea");return textarea.innerHTML=str,textarea.value},MIME$1={XML:"application/xml",XHTML:"application/xhtml+xml",HTML:"text/html",CSS:"text/css",SVG:"image/svg+xml"},PDB_HEADER={name:[0,32,"string"],type:[60,4,"string"],creator:[64,4,"string"],numRecords:[76,2,"uint"]},PALMDOC_HEADER={compression:[0,2,"uint"],numTextRecords:[8,2,"uint"],recordSize:[10,2,"uint"],encryption:[12,2,"uint"]},MOBI_HEADER={magic:[16,4,"string"],length:[20,4,"uint"],type:[24,4,"uint"],encoding:[28,4,"uint"],uid:[32,4,"uint"],version:[36,4,"uint"],titleOffset:[84,4,"uint"],titleLength:[88,4,"uint"],localeRegion:[94,1,"uint"],localeLanguage:[95,1,"uint"],resourceStart:[108,4,"uint"],huffcdic:[112,4,"uint"],numHuffcdic:[116,4,"uint"],exthFlag:[128,4,"uint"],trailingFlags:[240,4,"uint"],indx:[244,4,"uint"]},KF8_HEADER={resourceStart:[108,4,"uint"],fdst:[192,4,"uint"],numFdst:[196,4,"uint"],frag:[248,4,"uint"],skel:[252,4,"uint"],guide:[260,4,"uint"]},EXTH_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],count:[8,4,"uint"]},INDX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],type:[8,4,"uint"],idxt:[20,4,"uint"],numRecords:[24,4,"uint"],encoding:[28,4,"uint"],language:[32,4,"uint"],total:[36,4,"uint"],ordt:[40,4,"uint"],ligt:[44,4,"uint"],numLigt:[48,4,"uint"],numCncx:[52,4,"uint"]},TAGX_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numControlBytes:[8,4,"uint"]},HUFF_HEADER={magic:[0,4,"string"],offset1:[8,4,"uint"],offset2:[12,4,"uint"]},CDIC_HEADER={magic:[0,4,"string"],length:[4,4,"uint"],numEntries:[8,4,"uint"],codeLength:[12,4,"uint"]},FDST_HEADER={magic:[0,4,"string"],numEntries:[8,4,"uint"]},FONT_HEADER={flags:[8,4,"uint"],dataStart:[12,4,"uint"],keyLength:[16,4,"uint"],keyStart:[20,4,"uint"]},MOBI_ENCODING={1252:"windows-1252",65001:"utf-8"},EXTH_RECORD_TYPE={100:["creator","string",!0],101:["publisher"],103:["description"],104:["isbn"],105:["subject","string",!0],106:["date"],108:["contributor","string",!0],109:["rights"],110:["subjectCode","string",!0],112:["source","string",!0],113:["asin"],121:["boundary","uint"],122:["fixedLayout"],125:["numResources","uint"],126:["originalResolution"],127:["zeroGutter"],128:["zeroMargin"],129:["coverURI"],132:["regionMagnification"],201:["coverOffset","uint"],202:["thumbnailOffset","uint"],503:["title"],524:["language","string",!0],527:["pageProgressionDirection"]},MOBI_LANG={1:["ar","ar-SA","ar-IQ","ar-EG","ar-LY","ar-DZ","ar-MA","ar-TN","ar-OM","ar-YE","ar-SY","ar-JO","ar-LB","ar-KW","ar-AE","ar-BH","ar-QA"],2:["bg"],3:["ca"],4:["zh","zh-TW","zh-CN","zh-HK","zh-SG"],5:["cs"],6:["da"],7:["de","de-DE","de-CH","de-AT","de-LU","de-LI"],8:["el"],9:["en","en-US","en-GB","en-AU","en-CA","en-NZ","en-IE","en-ZA","en-JM",null,"en-BZ","en-TT","en-ZW","en-PH"],10:["es","es-ES","es-MX",null,"es-GT","es-CR","es-PA","es-DO","es-VE","es-CO","es-PE","es-AR","es-EC","es-CL","es-UY","es-PY","es-BO","es-SV","es-HN","es-NI","es-PR"],11:["fi"],12:["fr","fr-FR","fr-BE","fr-CA","fr-CH","fr-LU","fr-MC"],13:["he"],14:["hu"],15:["is"],16:["it","it-IT","it-CH"],17:["ja"],18:["ko"],19:["nl","nl-NL","nl-BE"],20:["no","nb","nn"],21:["pl"],22:["pt","pt-BR","pt-PT"],23:["rm"],24:["ro"],25:["ru"],26:["hr",null,"sr"],27:["sk"],28:["sq"],29:["sv","sv-SE","sv-FI"],30:["th"],31:["tr"],32:["ur"],33:["id"],34:["uk"],35:["be"],36:["sl"],37:["et"],38:["lv"],39:["lt"],41:["fa"],42:["vi"],43:["hy"],44:["az"],45:["eu"],46:["hsb"],47:["mk"],48:["st"],49:["ts"],50:["tn"],52:["xh"],53:["zu"],54:["af"],55:["ka"],56:["fo"],57:["hi"],58:["mt"],59:["se"],62:["ms"],63:["kk"],65:["sw"],67:["uz",null,"uz-UZ"],68:["tt"],69:["bn"],70:["pa"],71:["gu"],72:["or"],73:["ta"],74:["te"],75:["kn"],76:["ml"],77:["as"],78:["mr"],79:["sa"],82:["cy","cy-GB"],83:["gl","gl-ES"],87:["kok"],97:["ne"],98:["fy"]},concatTypedArray=(a,b)=>{const result=new a.constructor(a.length+b.length);return result.set(a),result.set(b,a.length),result},concatTypedArray3=(a,b,c)=>{const result=new a.constructor(a.length+b.length+c.length);return result.set(a),result.set(b,a.length),result.set(c,a.length+b.length),result},decoder=new TextDecoder,getString=buffer=>decoder.decode(buffer),getUint=buffer=>{if(!buffer)return;const l=buffer.byteLength,func=4===l?"getUint32":2===l?"getUint16":"getUint8";return new DataView(buffer)[func](0)},getStruct=(def,buffer)=>Object.fromEntries(Array.from(Object.entries(def)).map(([key,[start,len,type]])=>[key,("string"===type?getString:getUint)(buffer.slice(start,start+len))])),getDecoder=x=>new TextDecoder(MOBI_ENCODING[x]),getVarLen=(byteArray,i=0)=>{let value=0,length=0;for(const byte of byteArray.subarray(i,i+4))if(value=value<<7|(127&byte)>>>0,length++,128&byte)break;return{value:value,length:length}},getVarLenFromEnd=byteArray=>{let value=0;for(const byte of byteArray.subarray(-4))128&byte&&(value=0),value=value<<7|127&byte;return value},countBitsSet=x=>{let count=0;for(;x>0;x>>=1)1&~x||count++;return count},countUnsetEnd=x=>{let count=0;for(;!(1&x);)x>>=1,count++;return count},decompressPalmDOC=array=>{let output=[];for(let i=0;i>>3,length=3+(7&bytes);for(let j=0;j{const end=from+32,endByte=end>>3;let bits=0n;for(let i=from>>3;i<=endByte;i++)bits=bits<<8n|BigInt(byteArray[i]??0);return bits>>8n-BigInt(7&end)&0xffffffffn},getIndexData=async(indxIndex,loadRecord)=>{const indxRecord=await loadRecord(indxIndex),indx=getStruct(INDX_HEADER,indxRecord);if("INDX"!==indx.magic)throw new Error("Invalid INDX record");const decoder=getDecoder(indx.encoding),tagxBuffer=indxRecord.slice(indx.length),tagx=getStruct(TAGX_HEADER,tagxBuffer);if("TAGX"!==tagx.magic)throw new Error("Invalid TAGX section");const numTags=(tagx.length-12)/4,tagTable=Array.from({length:numTags},(_,i)=>new Uint8Array(tagxBuffer.slice(12+4*i,12+4*i+4))),cncx={};let cncxRecordOffset=0;for(let i=0;i1){const{value:value,length:length}=getVarLen(array,pos);tags.push([tag,null,value,numValues]),pos+=length}else tags.push([tag,1,null,numValues]);else tags.push([tag,value>>countUnsetEnd(mask),null,numValues])}const tagMap={};for(const[tag,valueCount,valueBytes,numValues]of tags){const values=[];if(null!=valueCount)for(let i=0;igetUint(buffer.slice(8*i,8*i+4))).map((x,i,a)=>[x,a[i+1]])}loadRecord(index){const offsets=this.#offsets[index];if(!offsets)throw new RangeError("Record index out of bounds");return this.#file.slice(...offsets).arrayBuffer()}async loadMagic(index){const start=this.#offsets[index][0];return getString(await this.#file.slice(start,start+4).arrayBuffer())}}class MOBI extends PDB{#start=0;#resourceStart;#decoder;#encoder;#decompress;#removeTrailingEntries;constructor({unzlib:unzlib}){super(),this.unzlib=unzlib}async open(file){await super.open(file),this.headers=this.#getHeaders(await super.loadRecord(0)),this.#resourceStart=this.headers.mobi.resourceStart;let isKF8=this.headers.mobi.version>=8;if(!isKF8){const boundary=this.headers.exth?.boundary;if(boundary<4294967295)try{this.headers=this.#getHeaders(await super.loadRecord(boundary)),this.#start=boundary,isKF8=!0}catch(e){console.warn(e),console.warn("Failed to open KF8; falling back to MOBI")}}return await this.#setup(),isKF8?new KF8(this).init():new MOBI6(this).init()}#getHeaders(buf){const palmdoc=getStruct(PALMDOC_HEADER,buf),mobi=getStruct(MOBI_HEADER,buf);if("MOBI"!==mobi.magic)throw new Error("Missing MOBI header");const{titleOffset:titleOffset,titleLength:titleLength,localeLanguage:localeLanguage,localeRegion:localeRegion}=mobi;mobi.title=buf.slice(titleOffset,titleOffset+titleLength);const lang=MOBI_LANG[localeLanguage];mobi.language=lang?.[localeRegion>>2]??lang?.[0];const exth=64&mobi.exthFlag?((buf,encoding)=>{const{magic:magic,count:count}=getStruct(EXTH_HEADER,buf);if("EXTH"!==magic)throw new Error("Invalid EXTH header");const decoder=getDecoder(encoding),results={};let offset=12;for(let i=0;i=8?getStruct(KF8_HEADER,buf):null}}async#setup(){const{palmdoc:palmdoc,mobi:mobi}=this.headers;this.#decoder=getDecoder(mobi.encoding),this.#encoder=new TextEncoder;const{compression:compression}=palmdoc;if(this.#decompress=1===compression?f=>f:2===compression?decompressPalmDOC:17480===compression?await(async(mobi,loadRecord)=>{const huffRecord=await loadRecord(mobi.huffcdic),{magic:magic,offset1:offset1,offset2:offset2}=getStruct(HUFF_HEADER,huffRecord);if("HUFF"!==magic)throw new Error("Invalid HUFF record");const table1=Array.from({length:256},(_,i)=>offset1+4*i).map(offset=>getUint(huffRecord.slice(offset,offset+4))).map(x=>[128&x,31&x,x>>>8]),table2=[null].concat(Array.from({length:32},(_,i)=>offset2+8*i).map(offset=>[getUint(huffRecord.slice(offset,offset+4)),getUint(huffRecord.slice(offset+4,offset+8))])),dictionary=[];for(let i=1;i{let output=new Uint8Array;const bitLength=8*byteArray.byteLength;for(let i=0;i>>24];if(!found){for(;bits>>>32-codeLengthbitLength)break;const code=value-(bits>>>32-codeLength);let[result,decompressed]=dictionary[code];decompressed||(result=decompress(result),dictionary[code]=[result,!0]),output=concatTypedArray(output,result)}return output};return decompress})(mobi,this.loadRecord.bind(this)):null,!this.#decompress)throw new Error("Unknown compression type");const{trailingFlags:trailingFlags}=mobi,multibyte=1&trailingFlags,numTrailingEntries=countBitsSet(trailingFlags>>>1);this.#removeTrailingEntries=array=>{for(let i=0;inew Uint8Array(buf)).then(this.#removeTrailingEntries).then(this.#decompress)}async loadResource(index){const buf=await super.loadRecord(this.#resourceStart+index),magic=getString(buf.slice(0,4));return"FONT"===magic?(async(buf,unzlib)=>{const{flags:flags,dataStart:dataStart,keyLength:keyLength,keyStart:keyStart}=getStruct(FONT_HEADER,buf),array=new Uint8Array(buf.slice(dataStart));if(2&flags){const bytes=16===keyLength?1024:1040,key=new Uint8Array(buf.slice(keyStart,keyStart+keyLength)),length=Math.min(bytes,array.length);for(var i=0;i{const{table:table,cncx:cncx}=await getIndexData(indxIndex,loadRecord),items=table.map(({tagMap:tagMap},index)=>({index:index,offset:tagMap[1]?.[0],size:tagMap[2]?.[0],label:cncx[tagMap[3]]??"",headingLevel:tagMap[4]?.[0],pos:tagMap[6],parent:tagMap[21]?.[0],firstChild:tagMap[22]?.[0],lastChild:tagMap[23]?.[0]})),getChildren=item=>(null==item.firstChild||(item.children=items.filter(x=>x.parent===item.index).map(getChildren)),item);return items.filter(item=>0===item.headingLevel).map(getChildren)})(index,this.loadRecord.bind(this))}getMetadata(){const{mobi:mobi,exth:exth}=this.headers;return{identifier:mobi.uid.toString(),title:unescapeHTML(exth?.title||this.decode(mobi.title)),author:exth?.creator?.map(unescapeHTML),publisher:unescapeHTML(exth?.publisher),language:exth?.language??mobi.language,published:exth?.date,description:unescapeHTML(exth?.description),subject:exth?.subject?.map(unescapeHTML),rights:unescapeHTML(exth?.rights)}}async getCover(){const{exth:exth}=this.headers,offset=exth?.coverOffset<4294967295?exth?.coverOffset:exth?.thumbnailOffset<4294967295?exth?.thumbnailOffset:null;if(null!=offset){const buf=await this.loadResource(offset);return new Blob([buf])}}}const mbpPagebreakRegex=/<\s*(?:mbp:)?pagebreak[^>]*>/gi,fileposRegex=/<[^<>]+filepos=['"]{0,1}(\d+)[^<>]*>/gi;class MOBI6{parser=new DOMParser;serializer=new XMLSerializer;#resourceCache=new Map;#textCache=new Map;#cache=new Map;#sections;#fileposList=[];#type=MIME$1.HTML;constructor(mobi){this.mobi=mobi}async init(){const recordBuffers=[];for(let i=0;isum+buf.byteLength,0),array=new Uint8Array(totalLength);recordBuffers.reduce((offset,buf)=>(array.set(new Uint8Array(buf),offset),offset+buf.byteLength),0);const str=function(uint8Array){let result="";for(let i=0;im.index)).map((start,i,a)=>{const end=a[i+1]??array.length;return{book:this,raw:array.subarray(start,end)}}).map((section,i,arr)=>(section.start=arr[i-1]?.end??0,section.end=section.start+section.raw.byteLength,section)),this.sections=this.#sections.map((section,index)=>({id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.end-section.start}));try{this.landmarks=await this.getGuide();const tocHref=this.landmarks.find(({type:type})=>type?.includes("toc"))?.href;if(tocHref){const{index:index}=this.resolveHref(tocHref),doc=await this.sections[index].createDocument();let lastItem,lastLevel=0,lastIndent=0;const lastLevelOfIndent=new Map,lastParentOfLevel=new Map;this.toc=Array.from(doc.querySelectorAll("a[filepos]")).reduce((arr,a)=>{const indent=(el=>{let x=0;for(;el;){const parent=el.parentElement;if(parent){const tag=parent.tagName.toLowerCase();"p"===tag?x+=1.5:"blockquote"===tag&&(x+=2)}el=parent}return x})(a),item={label:a.innerText?.trim()??"",href:`#filepos${a.getAttribute("filepos")}`},level=indent>lastIndent?lastLevel+1:indent===lastIndent?lastLevel:lastLevelOfIndent.get(indent)??Math.max(0,lastLevel-1);if(level>lastLevel)lastItem?(lastItem.subitems??=[],lastItem.subitems.push(item),lastParentOfLevel.set(level,lastItem)):arr.push(item);else{const parent=lastParentOfLevel.get(level);parent?parent.subitems.push(item):arr.push(item)}return lastItem=item,lastLevel=level,lastIndent=indent,lastLevelOfIndent.set(indent,level),arr},[])}}catch(e){console.warn(e)}return this.#fileposList=[...new Set(Array.from(str.matchAll(fileposRegex),m=>m[1]))].map(filepos=>({filepos:filepos,number:Number(filepos)})).sort((a,b)=>a.number-b.number),this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getGuide(){const doc=await this.createDocument(this.#sections[0]);return Array.from(doc.getElementsByTagName("reference"),ref=>({label:ref.getAttribute("title"),type:ref.getAttribute("type")?.split(/\s/),href:`#filepos${ref.getAttribute("filepos")}`}))}async loadResource(index){if(this.#resourceCache.has(index))return this.#resourceCache.get(index);const raw=await this.mobi.loadResource(index),url=URL.createObjectURL(new Blob([raw]));return this.#resourceCache.set(index,url),url}async loadRecindex(recindex){return this.loadResource(Number(recindex)-1)}async replaceResources(doc){for(const img of doc.querySelectorAll("img[recindex]")){const recindex=img.getAttribute("recindex");try{img.src=await this.loadRecindex(recindex)}catch(e){console.warn(`Failed to load image ${recindex}`)}}for(const media of doc.querySelectorAll("[mediarecindex]")){const mediarecindex=media.getAttribute("mediarecindex"),recindex=media.getAttribute("recindex");try{media.src=await this.loadRecindex(mediarecindex),recindex&&(media.poster=await this.loadRecindex(recindex))}catch(e){console.warn(`Failed to load media ${mediarecindex}`)}}for(const a of doc.querySelectorAll("[filepos]")){const filepos=a.getAttribute("filepos");a.href=`#filepos${filepos}`}}async loadText(section){if(this.#textCache.has(section))return this.#textCache.get(section);const{raw:raw}=section,fileposList=this.#fileposList.filter(({number:number})=>number>=section.start&&number({...obj,offset:obj.number-section.start}));let arr=raw;fileposList.length&&(arr=raw.subarray(0,fileposList[0].offset),fileposList.forEach(({filepos:filepos,offset:offset},i)=>{const next=fileposList[i+1],a=this.mobi.encode(``);arr=concatTypedArray3(arr,a,raw.subarray(offset,next?.offset))}));const str=this.mobi.decode(arr).replaceAll(mbpPagebreakRegex,"");return this.#textCache.set(section,str),str}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const doc=await this.createDocument(section),style=doc.createElement("style");doc.head.append(style),style.append(doc.createTextNode("blockquote {\n margin-block-start: 0;\n margin-block-end: 0;\n margin-inline-start: 1em;\n margin-inline-end: 0;\n }")),await this.replaceResources(doc);const result=this.serializer.serializeToString(doc),url=URL.createObjectURL(new Blob([result],{type:this.#type}));return this.#cache.set(section,url),url}resolveHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number),anchor:doc=>doc.getElementById(`filepos${filepos}`)}}resolveHrefIndex(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return{index:this.#sections.findIndex(section=>section.end>number)}}splitTOCHref(href){const filepos=href.match(/#filepos(.*)/)[1],number=Number(filepos);return[this.#sections.findIndex(section=>section.end>number),`filepos${filepos}`]}getTOCFragment(doc,id){return doc.getElementById(id)}isExternal(uri){return/^(?!blob|filepos)\w+:/i.test(uri)}destroy(){for(const url of this.#resourceCache.values())URL.revokeObjectURL(url);for(const url of this.#cache.values())URL.revokeObjectURL(url)}}const kindleResourceRegex=/kindle:(flow|embed):(\w+)(?:\?mime=(\w+\/[-+.\w]+))?/,kindlePosRegex=/kindle:pos:fid:(\w+):off:(\w+)/,parsePosURI=str=>{const[fid,off]=str.match(kindlePosRegex).slice(1);return{fid:parseInt(fid,32),off:parseInt(off,32)}},makePosURI=(fid=0,off=0)=>`kindle:pos:fid:${fid.toString(32).toUpperCase().padStart(4,"0")}:off:${off.toString(32).toUpperCase().padStart(10,"0")}`,getFragmentSelector=str=>{const match=str.match(/\s(id|name|aid)\s*=\s*['"]([^'"]*)['"]/i);if(!match)return;const[,attr,value]=match;return`[${attr}="${CSS.escape(value)}"]`},getPageSpread=properties=>{for(const p of properties){if("page-spread-left"===p||"rendition:page-spread-left"===p)return"left";if("page-spread-right"===p||"rendition:page-spread-right"===p)return"right";if("rendition:page-spread-center"===p)return"center"}};class KF8{parser=new DOMParser;serializer=new XMLSerializer;#cache=new Map;#fragmentOffsets=new Map;#fragmentSelectors=new Map;#tables={};#sections;#fullRawLength;#rawHead=new Uint8Array;#rawTail=new Uint8Array;#lastLoadedHead=-1;#lastLoadedTail=-1;#type=MIME$1.XHTML;#inlineMap=new Map;constructor(mobi){this.mobi=mobi}async init(){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{kf8:kf8}=this.mobi.headers;try{const fdstBuffer=await loadRecord(kf8.fdst),fdst=getStruct(FDST_HEADER,fdstBuffer);if("FDST"!==fdst.magic)throw new Error("Missing FDST record");const fdstTable=Array.from({length:fdst.numEntries},(_,i)=>12+8*i).map(offset=>[getUint(fdstBuffer.slice(offset,offset+4)),getUint(fdstBuffer.slice(offset+4,offset+8))]);this.#tables.fdstTable=fdstTable,this.#fullRawLength=fdstTable[fdstTable.length-1][1]}catch{}const skelTable=(await getIndexData(kf8.skel,loadRecord)).table.map(({name:name,tagMap:tagMap},index)=>({index:index,name:name,numFrag:tagMap[1][0],offset:tagMap[6][0],length:tagMap[6][1]})),fragData=await getIndexData(kf8.frag,loadRecord),fragTable=fragData.table.map(({name:name,tagMap:tagMap})=>({insertOffset:parseInt(name),selector:fragData.cncx[tagMap[2][0]],index:tagMap[4][0],offset:tagMap[6][0],length:tagMap[6][1]}));this.#tables.skelTable=skelTable,this.#tables.fragTable=fragTable,this.#sections=skelTable.reduce((arr,skel)=>{const last=arr[arr.length-1],fragStart=last?.fragEnd??0,fragEnd=fragStart+skel.numFrag,frags=fragTable.slice(fragStart,fragEnd),length=skel.length+frags.map(f=>f.length).reduce((a,b)=>a+b),totalLength=(last?.totalLength??0)+length;return arr.concat({skel:skel,frags:frags,fragEnd:fragEnd,length:length,totalLength:totalLength})},[]);const resources=await this.getResourcesByMagic(["RESC","PAGE"]),pageSpreads=new Map;if(resources.RESC){const buf=await this.mobi.loadRecord(resources.RESC),str=this.mobi.decode(buf.slice(16)).replace(/\0/g,""),index=str.search(/\?>/),xmlStr=`${str.slice(index)}`,opf=this.parser.parseFromString(xmlStr,MIME$1.XML);for(const $itemref of opf.querySelectorAll("spine > itemref")){const i=parseInt($itemref.getAttribute("skelid"));pageSpreads.set(i,getPageSpread($itemref.getAttribute("properties")?.split(" ")??[]))}}this.sections=this.#sections.map((section,index)=>section.frags.length?{id:index,load:()=>this.loadSection(section),createDocument:()=>this.createDocument(section),resolveHref:href=>this.resolveHref(href),size:section.length,pageSpread:pageSpreads.get(index)}:{linear:"no"});try{const ncx=await this.mobi.getNCX(),map=({label:label,pos:pos,children:children})=>{const[fid,off]=pos,href=makePosURI(fid,off),arr=this.#fragmentOffsets.get(fid);return arr?arr.push(off):this.#fragmentOffsets.set(fid,[off]),{label:unescapeHTML(label),href:href,subitems:children?.map(map)}};this.toc=ncx?.map(map),this.landmarks=await this.getGuide()}catch(e){console.warn(e)}const{exth:exth}=this.mobi.headers;return this.dir=exth.pageProgressionDirection,this.rendition={layout:"true"===exth.fixedLayout?"pre-paginated":"reflowable",viewport:Object.fromEntries(exth.originalResolution?.split("x")?.slice(0,2)?.map((x,i)=>[i?"height":"width",x])??[])},this.metadata=this.mobi.getMetadata(),this.getCover=this.mobi.getCover.bind(this.mobi),this}async getResourcesByMagic(keys){const results={},start=this.mobi.headers.kf8.resourceStart,end=this.mobi.pdb.numRecords;for(let i=start;ikey===magic);match&&(results[match]=i)}catch{}return results}async getGuide(){const index=this.mobi.headers.kf8.guide;if(index<4294967295){const loadRecord=this.mobi.loadRecord.bind(this.mobi),{table:table,cncx:cncx}=await getIndexData(index,loadRecord);return table.map(({name:name,tagMap:tagMap})=>({label:cncx[tagMap[1][0]]??"",type:name?.split(/\s/),href:makePosURI(tagMap[6]?.[0]??tagMap[3]?.[0])}))}}async loadResourceBlob(str){let{resourceType:resourceType,id:id,type:type}=(str=>{const[resourceType,id,type]=str.match(kindleResourceRegex).slice(1);return{resourceType:resourceType,id:parseInt(id,32),type:type}})(str);"image/jpg"===type&&(type="image/jpeg");const raw="flow"===resourceType?await this.loadFlow(id):await this.mobi.loadResource(id-1),result=[MIME$1.XHTML,MIME$1.HTML,MIME$1.CSS,MIME$1.SVG].includes(type)?await this.replaceResources(this.mobi.decode(raw)):raw,doc=type===MIME$1.SVG?this.parser.parseFromString(result,type):null;return[new Blob([result],{type:type}),doc?.getElementsByTagNameNS("http://www.w3.org/2000/svg","image")?.length?doc.documentElement:null]}async loadResource(str){if(this.#cache.has(str))return this.#cache.get(str);const[blob,inline]=await this.loadResourceBlob(str),url=inline?str:URL.createObjectURL(blob);return inline&&this.#inlineMap.set(url,inline),this.#cache.set(str,url),url}replaceResources(str){return(async(str,regex,f)=>{const matches=[];str.replace(regex,(...args)=>(matches.push(args),null));const results=[];for(const args of matches)results.push(await f(...args));return str.replace(regex,()=>results.shift())})(str,new RegExp(kindleResourceRegex,"g"),this.loadResource.bind(this))}async loadRaw(start,end){const distanceHead=end-this.#rawHead.length,distanceEnd=null==this.#fullRawLength?1/0:this.#fullRawLength-this.#rawTail.length-start;if(distanceHead<0||distanceHeadstart;){const index=this.mobi.headers.palmdoc.numTextRecords-1-++this.#lastLoadedTail,data=await this.mobi.loadText(index);this.#rawTail=concatTypedArray(data,this.#rawTail)}const rawTailStart=this.#fullRawLength-this.#rawTail.length;return this.#rawTail.slice(start-rawTailStart,end-rawTailStart)}loadFlow(index){if(index<4294967295)return this.loadRaw(...this.#tables.fdstTable[index])}async loadText(section){const{skel:skel,frags:frags,length:length}=section,raw=await this.loadRaw(skel.offset,skel.offset+length);let skeleton=raw.slice(0,skel.length);for(const frag of frags){const insertOffset=frag.insertOffset-skel.offset,offset=skel.length+frag.offset,fragRaw=raw.slice(offset,offset+frag.length);skeleton=concatTypedArray3(skeleton.slice(0,insertOffset),fragRaw,skeleton.slice(insertOffset));const offsets=this.#fragmentOffsets.get(frag.index);if(offsets)for(const offset of offsets){const str=this.mobi.decode(fragRaw.slice(offset)),selector=getFragmentSelector(str);this.#setFragmentSelector(frag.index,offset,selector)}}return this.mobi.decode(skeleton)}async createDocument(section){const str=await this.loadText(section);return this.parser.parseFromString(str,this.#type)}async loadSection(section){if(this.#cache.has(section))return this.#cache.get(section);const str=await this.loadText(section),replaced=await this.replaceResources(str);let doc=this.parser.parseFromString(replaced,this.#type);doc.querySelector("parsererror")&&(this.#type=MIME$1.HTML,doc=this.parser.parseFromString(replaced,this.#type));for(const[url,node]of this.#inlineMap)for(const el of doc.querySelectorAll(`img[src="${url}"]`))el.replaceWith(node);const url=URL.createObjectURL(new Blob([this.serializer.serializeToString(doc)],{type:this.#type}));return this.#cache.set(section,url),url}getIndexByFID(fid){return this.#sections.findIndex(section=>section.frags.some(frag=>frag.index===fid))}#setFragmentSelector(id,offset,selector){const map=this.#fragmentSelectors.get(id);if(map)map.set(offset,selector);else{const map=new Map;this.#fragmentSelectors.set(id,map),map.set(offset,selector)}}async resolveHref(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(index<0)return;const saved=this.#fragmentSelectors.get(fid)?.get(off);if(saved)return{index:index,anchor:doc=>doc.querySelector(saved)};const{skel:skel,frags:frags}=this.#sections[index],frag=frags.find(frag=>frag.index===fid),offset=skel.offset+skel.length+frag.offset,fragRaw=await this.loadRaw(offset,offset+frag.length),str=this.mobi.decode(fragRaw.slice(off)),selector=getFragmentSelector(str);this.#setFragmentSelector(fid,off,selector);return{index:index,anchor:doc=>doc.querySelector(selector)}}async resolveHrefIndex(href){const{fid:fid,off:off}=parsePosURI(href),index=this.getIndexByFID(fid);if(!(index<0))return{index:index}}splitTOCHref(href){const pos=parsePosURI(href);return[this.getIndexByFID(pos.fid),pos]}getTOCFragment(doc,{fid:fid,off:off}){const selector=this.#fragmentSelectors.get(fid)?.get(off);return doc.querySelector(selector)}isExternal(uri){return/^(?!blob|kindle)\w+:/i.test(uri)}destroy(){for(const url of this.#cache.values())URL.revokeObjectURL(url)}}class MobiRender extends GeneralRender{constructor(mobiBuffer,config){super(Object.assign(Object.assign({},config),{format:"MOBI"})),this.mobiBuffer=mobiBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.mobiBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(!(yield(async file=>"BOOKMOBI"===getString(await file.slice(60,68).arrayBuffer()))(file)))throw new Error("Not a valid MOBI file");this.book=yield new MOBI({unzlib:unzlibSync}).open(file)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const pdfjsPath=path=>`${isElectron()?".":""}/lib/pdfjs/${path}`,pdfjsLib=window.pdfjsLib,fetchText$1=async url=>await(await fetch(url)).text(),isElectron=()=>"undefined"!=typeof window&&"object"==typeof window.process&&"renderer"===window.process.type||(!("undefined"==typeof process||"object"!=typeof process.versions||!process.versions.electron)||"object"==typeof navigator&&"string"==typeof navigator.userAgent&&navigator.userAgent.indexOf("Electron")>=0);function vexPromptAsync(message,placeholder="",value=""){return new Promise(resolve=>{vex.dialog.prompt({message:message,placeholder:placeholder,value:value,callback:function(input){resolve(input)}})})}const textLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("text_layer_builder.css")),annotationLayerBuilderCSS=async()=>await fetchText$1(pdfjsPath("annotation_layer_builder.css")),renderPage=async(page,getImageBlob)=>{try{const viewport=page.getViewport({scale:1});if(getImageBlob){const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");return await page.render({canvasContext:canvasContext,viewport:viewport}).promise,new Promise(resolve=>canvas.toBlob(resolve))}return URL.createObjectURL(new Blob([`\n \n \n \n \n \n
\n
\n
\n
\n \n
\n
\n`],{type:"text/html"}))}catch(error){console.error(error)}},makeTOCItem=item=>({label:item.title,href:item.dest?JSON.stringify(item.dest):null,subitems:item.items.length?item.items.map(makeTOCItem):null});function getPasswordPrompt(type="need"){return(navigator.language?.toLowerCase()||"en").startsWith("zh")?"need"===type?"请输入PDF密码:":"密码错误,请重新输入:":"need"===type?"Need password to open this PDF:":"Incorrect password, please try again:"}const makePDF=async(file,password)=>{let pdf;for(;;){const transport=new pdfjsLib.PDFDataRangeTransport(file.size,[]);transport.requestDataRange=(begin,end)=>{file.slice(begin,end).arrayBuffer().then(chunk=>{transport.onDataRange(begin,chunk)})};try{pdf=await pdfjsLib.getDocument({range:transport,cMapUrl:pdfjsPath("cmaps/"),standardFontDataUrl:pdfjsPath("standard_fonts/"),isEvalSupported:!1,password:password}).promise;break}catch(e){if("PasswordException"!==e.name)throw e;if(e.code===pdfjsLib.PasswordResponses.NEED_PASSWORD?isElectron()?(password=await vexPromptAsync(getPasswordPrompt("need"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("need")):e.code===pdfjsLib.PasswordResponses.INCORRECT_PASSWORD&&(isElectron()?(password=await vexPromptAsync(getPasswordPrompt("incorrect"),"",""),vex.closeAll()):password=prompt(getPasswordPrompt("incorrect"))),!password)throw new Error("PDF loading failed: no password provided")}}let isScannedPdf=!1,testedPage=pdf.numPages>0?await pdf.getPage(Math.floor(pdf.numPages/2)+1):null;if(testedPage){const textContent=await testedPage.getTextContent();if(isScannedPdf=0===textContent.items.length,textContent.items.length>0){isScannedPdf=textContent.items.reduce((sum,item)=>sum+item.str.trim().length,0)<45}testedPage.cleanup()}const book={rendition:{layout:"pre-paginated"}},{metadata:metadata,info:info}=await pdf.getMetadata()??{};book.metadata={title:metadata?.get("dc:title")??info?.Title,author:metadata?.get("dc:creator")??info?.Author,contributor:metadata?.get("dc:contributor"),description:metadata?.get("dc:description")??info?.Subject,language:metadata?.get("dc:language"),publisher:metadata?.get("dc:publisher"),subject:metadata?.get("dc:subject"),identifier:metadata?.get("dc:identifier"),source:metadata?.get("dc:source"),rights:metadata?.get("dc:rights")},book.metadata.description=(book.metadata.description?book.metadata.description:"")+(isScannedPdf?"\nscanned PDF":"")+(password?"\nprotected PDF: #"+password+"#":"");const outline=await pdf.getOutline();book.toc=outline?.map(makeTOCItem);const cache=new Map;return book.sections=Array.from({length:pdf.numPages}).map((_,i)=>({id:i,load:async()=>{const cached=cache.get(i);if(cached)return cached;const url=await renderPage(await pdf.getPage(i+1),!1);return cache.set(i,url),url},unload:async()=>{(await pdf.getPage(i+1)).cleanup()},render:async(doc,scale,isMobile,viewer,isKeepPDFBackground)=>{await(async(page,pdf,doc,zoom,isMobile,viewer,isKeepPDFBackground)=>{try{let pixelRatio="ios"===window.platform?1:window.visualViewport?.scale||1,devicePixelRatio=window.devicePixelRatio*pixelRatio;if("ios"===window.platform){const rawDpr=devicePixelRatio,MAX_RENDER_DPR=2,MAX_CANVAS_PIXELS=3145728;devicePixelRatio=Math.min(rawDpr,MAX_RENDER_DPR);const initialViewport=page.getViewport({scale:zoom*devicePixelRatio}),totalPixels=initialViewport.width*initialViewport.height;totalPixels>MAX_CANVAS_PIXELS&&(devicePixelRatio*=Math.sqrt(MAX_CANVAS_PIXELS/totalPixels))}const scale=zoom*devicePixelRatio;let docLayer=doc.querySelector("#koodoPDFLayer");docLayer.style.visibility="hidden",docLayer.style.transform=`scale(${1/devicePixelRatio})`,docLayer.style.transformOrigin="top left",docLayer.style.setProperty("--scale-factor",scale);const viewport=page.getViewport({scale:scale});docLayer.style.width=`${viewport.width}px`,docLayer.style.height=`${viewport.height}px`;const canvas=document.createElement("canvas");canvas.height=viewport.height,canvas.width=viewport.width;const canvasContext=canvas.getContext("2d");try{"yes"===isKeepPDFBackground?await page.render({canvasContext:canvasContext,viewport:viewport}).promise:await page.render({canvasContext:canvasContext,viewport:viewport,background:"rgba(0,0,0,0)"}).promise}catch(error){console.error(error)}doc.querySelector("#canvas").replaceChildren(doc.adoptNode(canvas)),docLayer.style.overflow="hidden";const container=doc.querySelector("#textLayer");try{const textLayer=new pdfjsLib.TextLayer({textContentSource:await page.streamTextContent(),container:container,viewport:viewport});await textLayer.render()}catch(error){console.error(error)}for(const canvas of document.querySelectorAll(".hiddenCanvasElement"))Object.assign(canvas.style,{position:"absolute",top:"0",left:"0",width:"0",height:"0",display:"none"});const endOfContent=document.createElement("div");endOfContent.className="endOfContent",container.append(endOfContent);let isSelecting=!1,closestElement=null;container.onpointerdown=()=>{let iWin=doc?.defaultView;if(iWin.getSelection().toString().trim().length>0)return container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),void container.append(endOfContent);container.classList.add("selecting"),isSelecting=!0},"yes"!==isMobile?(container.onpointerup=()=>{container.classList.remove("selecting"),isSelecting=!1,endOfContent.remove(),container.append(endOfContent)},container.onpointermove=e=>{if(!isSelecting)return;let element=e.target.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement)}):doc.addEventListener("selectionchange",e=>{if(!isSelecting)return;let iWin=doc?.defaultView;var endNode=iWin.getSelection().getRangeAt(0).endContainer;let element=endNode.nodeType===Node.TEXT_NODE?endNode.parentNode:endNode;element=element.closest(".textLayer > span");const isText=null!==element;container.style.cursor=isText?"text":"default",isText&&(closestElement=element),endOfContent.remove(),container.insertBefore(endOfContent,closestElement.nextSibling?closestElement.nextSibling:closestElement)});const div=doc.querySelector("#annotationLayer");try{await new pdfjsLib.AnnotationLayer({page:page,viewport:viewport,div:div}).render({annotations:await page.getAnnotations(),linkService:{goToDestination:async dest=>{try{const parsed="string"==typeof dest?await pdf.getDestination(dest):dest;if(!parsed||!Array.isArray(parsed)||0===parsed.length)return void console.warn("Invalid destination:",dest);const pageIndex=await pdf.getPageIndex(parsed[0]);viewer.goToChapterDocIndex(pageIndex)}catch(error){console.error("Error navigating to destination:",error)}},getDestinationHash:dest=>JSON.stringify(dest),addLinkAttributes:(link,url)=>link.href=url}})}catch(error){console.error(error)}}catch(error){console.error(error)}})(await pdf.getPage(i+1),pdf,doc,scale,isMobile,viewer,isKeepPDFBackground)},getTextContent:async()=>{const page=await pdf.getPage(i+1);return await page.getTextContent()},size:1e3,getDimension:async()=>{let viewport=(await pdf.getPage(i+1)).getViewport({scale:1});return{width:viewport.width,height:viewport.height}},getPage:async()=>await pdf.getPage(i+1)})),book.isExternal=uri=>/^\w+:/i.test(uri),book.resolveHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return{index:await pdf.getPageIndex(dest[0])}},book.resolveHrefIndex=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed,index=await pdf.getPageIndex(dest[0]);return{index:index||0}},book.splitTOCHref=async href=>{const parsed=JSON.parse(href),dest="string"==typeof parsed?await pdf.getDestination(parsed):parsed;return[await pdf.getPageIndex(dest[0]),null]},book.getTOCFragment=doc=>doc.documentElement,book.getCover=async()=>renderPage(await pdf.getPage(1),!0),book.destroy=()=>pdf.destroy(),book};class AnnotationManager{constructor(config={}){this.platform="web",this.isScannedPDF="no",this.annotationStyle="brush",this.brushColor="#ff0000",this.brushWidth=2,this.highlighterColor="#ffff00",this.highlighterWidth=24,this.highlighterOpacity=.4,this.shapeType="rect",this.shapeColor="#ff0000",this.shapeWidth=2,this.eraserWidth=24,this.quickErase="no",this.textSize=24,this.textFont="sans-serif",this.textColor="#ff0000",this.isDrawing="no",this.fabricCanvasMap=new Map,this.fabricHistoryMap=new Map,this.fabricHistoryLock=new Set,this.fabricSyncListenerMap=new Map,this.onAnnotationChanged=()=>{},this.platform=config.platform||"web",this.isScannedPDF=config.isScannedPDF||"no",this.annotationStyle=config.annotationStyle||"brush",this.brushColor=config.brushColor||"#ff0000",this.brushWidth=config.brushWidth||2,this.highlighterColor=config.highlighterColor||"#ffff00",this.highlighterWidth=config.highlighterWidth||24,this.highlighterOpacity=null!=config.highlighterOpacity?config.highlighterOpacity:.4,this.shapeType=config.shapeType||"rect",this.shapeColor=config.shapeColor||"#ff0000",this.shapeWidth=config.shapeWidth||2,this.eraserWidth=null!=config.eraserWidth?config.eraserWidth:24,this.quickErase=config.quickErase||"no",this.textSize=null!=config.textSize?config.textSize:24,this.textFont=config.textFont||"sans-serif",this.textColor=config.textColor||"#ff0000",this.isDrawing=config.isDrawing||"no"}applyConfig(config){config.annotationStyle&&this.setAnnotationStyle(config.annotationStyle),config.brushColor&&this.setBrushColor(config.brushColor),config.brushWidth&&this.setBrushWidth(config.brushWidth),config.highlighterColor&&this.setHighlighterColor(config.highlighterColor),config.highlighterWidth&&this.setHighlighterWidth(config.highlighterWidth),null!=config.highlighterOpacity&&this.setHighlighterOpacity(config.highlighterOpacity),config.shapeType&&this.setShapeType(config.shapeType),config.shapeColor&&this.setShapeColor(config.shapeColor),config.shapeWidth&&this.setShapeWidth(config.shapeWidth),config.eraserWidth&&this.setEraserWidth(config.eraserWidth),config.quickErase&&this.setQuickErase(config.quickErase),null!=config.textSize&&this.setTextSize(config.textSize),config.textFont&&this.setTextFont(config.textFont),config.textColor&&this.setTextColor(config.textColor),config.isDrawing&&this.setIsDrawing(config.isDrawing)}isCanvasEnabled(){return"web"===this.platform&&"yes"===this.isScannedPDF}hasCanvas(chapterDocIndex){return this.fabricCanvasMap.has(chapterDocIndex)}getCanvas(chapterDocIndex){return this.fabricCanvasMap.get(chapterDocIndex)}initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc){if(canvasEle){canvasEle.style.display="block";const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&(fabricLib.document=subDoc,fabricLib.window=subWin);const canvas=new fabricLib.Canvas(canvasEle,{isDrawingMode:"yes"===this.isDrawing,selection:!0,backgroundColor:"transparent"}),layerRect=docLayer.getBoundingClientRect();layerRect.width>0&&layerRect.height>0&&canvas.setDimensions({width:Math.round(layerRect.width),height:Math.round(layerRect.height)}),this.applyFabricBrush(canvas),this.fabricCanvasMap.set(chapterDocIndex,canvas),this.fabricHistoryMap.set(chapterDocIndex,[]),canvas.on("object:added",opt=>{this.fabricHistoryLock.has(chapterDocIndex)||(this.pushFabricHistory(chapterDocIndex,opt.target),this.onAnnotationChanged(chapterDocIndex))}),canvas.on("object:removed",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)}),canvas.on("object:modified",()=>{this.fabricHistoryLock.has(chapterDocIndex)||this.onAnnotationChanged(chapterDocIndex)});const syncFabricEnv=()=>{subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)};subDoc.addEventListener("mousedown",syncFabricEnv,!0),subDoc.addEventListener("touchstart",syncFabricEnv,!0),this.fabricSyncListenerMap.set(chapterDocIndex,{doc:subDoc,fn:syncFabricEnv}),this.attachFabricKeyListeners(chapterDocIndex,subDoc),this.attachShapeDrawListeners(chapterDocIndex,canvas),this.attachTextCreateListeners(chapterDocIndex,canvas),this.attachEraserListeners(chapterDocIndex,canvas)}}applyFabricBrush(canvas){if(!canvas)return;const drawing="yes"===this.isDrawing,isShape="shape"===this.annotationStyle,isText="text"===this.annotationStyle,isEraser="eraser"===this.annotationStyle;if(!canvas.freeDrawingBrush||isShape||isText||isEraser||("highlighter"===this.annotationStyle?(canvas.freeDrawingBrush.color=this.toRgba(this.highlighterColor,this.highlighterOpacity),canvas.freeDrawingBrush.width=this.highlighterWidth,canvas.freeDrawingBrush.strokeLineCap="round",canvas.freeDrawingBrush.strokeLineJoin="round"):(canvas.freeDrawingBrush.color=this.brushColor,canvas.freeDrawingBrush.width=this.brushWidth)),canvas.isDrawingMode=drawing&&!isShape&&!isText&&!isEraser,drawing)if(isText)canvas.selection=!0,canvas.defaultCursor="text",canvas.hoverCursor="text";else if(isEraser){canvas.selection=!1;const cursor=this.buildEraserCursor();canvas.defaultCursor=cursor,canvas.hoverCursor=cursor}else canvas.selection=!1,canvas.defaultCursor="crosshair",canvas.hoverCursor="crosshair";else canvas.selection=!0,canvas.defaultCursor="default",canvas.hoverCursor="move"}createShapeObject(x1,y1,x2,y2){const fabricLib=window.fabric;if(!fabricLib)return null;const color=this.shapeColor,width=this.shapeWidth,common={stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:"transparent",selectable:!0},minX=Math.min(x1,x2),minY=Math.min(y1,y2),dx=x2-x1,dy=y2-y1,absDx=Math.abs(dx),absDy=Math.abs(dy);switch(this.shapeType){case"rect":return new fabricLib.Rect(Object.assign(Object.assign({},common),{left:minX,top:minY,width:absDx,height:absDy}));case"circle":{const radius=Math.hypot(dx,dy)/2;return new fabricLib.Circle(Object.assign(Object.assign({},common),{left:x1,top:y1,radius:radius,originX:"center",originY:"center"}))}case"ellipse":return new fabricLib.Ellipse(Object.assign(Object.assign({},common),{left:(x1+x2)/2,top:(y1+y2)/2,rx:absDx/2,ry:absDy/2,originX:"center",originY:"center"}));case"line":return new fabricLib.Line([x1,y1,x2,y2],{stroke:color,strokeWidth:width,strokeLineCap:"round",selectable:!0});case"arrow":return new fabricLib.Path(this.buildArrowPath(x1,y1,x2,y2,width),{stroke:color,strokeWidth:width,strokeLineCap:"round",strokeLineJoin:"round",fill:color,selectable:!0});default:return null}}buildArrowPath(x1,y1,x2,y2,width){const dx=x2-x1,dy=y2-y1,len=Math.hypot(dx,dy);if(len<1)return[["M",x1,y1],["L",x2,y2]];const ux=dx/len,uy=dy/len,head=Math.max(3*width,8),wing=.5*head,px=-uy,baseX=x2-ux*head,baseY=y2-uy*head;return[["M",x1,y1],["L",baseX,baseY],["M",baseX+px*wing,baseY+ux*wing],["L",x2,y2],["L",baseX-px*wing,baseY-ux*wing],["Z"]]}attachShapeDrawListeners(chapterDocIndex,canvas){if(!canvas)return;let isDown=!1,origX=0,origY=0,lastX=0,lastY=0,activeShape=null;canvas.on("mouse:down",o=>{if("shape"!==this.annotationStyle||"yes"!==this.isDrawing)return;isDown=!0;const pointer=canvas.getPointer(o.e);origX=pointer.x,origY=pointer.y,lastX=origX,lastY=origY,this.fabricHistoryLock.add(chapterDocIndex),activeShape=this.createShapeObject(origX,origY,origX,origY),activeShape&&canvas.add(activeShape)}),canvas.on("mouse:move",o=>{if(!isDown||!activeShape)return;const pointer=canvas.getPointer(o.e);lastX=pointer.x,lastY=pointer.y;const next=this.createShapeObject(origX,origY,lastX,lastY);next&&(canvas.remove(activeShape),activeShape=next,canvas.add(activeShape),canvas.requestRenderAll())}),canvas.on("mouse:up",()=>{if(!isDown)return;isDown=!1,this.fabricHistoryLock.delete(chapterDocIndex);const moved=Math.hypot(lastX-origX,lastY-origY)>=2;activeShape&&moved?(this.pushFabricHistory(chapterDocIndex,activeShape),this.onAnnotationChanged(chapterDocIndex)):activeShape&&(canvas.remove(activeShape),canvas.requestRenderAll()),activeShape=null})}attachEraserListeners(chapterDocIndex,canvas){if(!canvas)return;let isErasing=!1;const eraseAt=opt=>{const pointer=canvas.getPointer(opt.e),radius=this.eraserWidth/2,targets=canvas.getObjects().filter(obj=>this.hitTestObject(obj,pointer.x,pointer.y,radius));0!==targets.length&&(targets.forEach(obj=>{if(this.removeFromHistory(chapterDocIndex,obj),"yes"===this.quickErase)canvas.remove(obj);else if(this.canSliceObject(obj)){const pieces=this.slicePathObject(obj,pointer.x,pointer.y,radius);canvas.remove(obj),pieces.forEach(piece=>canvas.add(piece))}else canvas.remove(obj)}),canvas.requestRenderAll())};canvas.on("mouse:down",o=>{"eraser"===this.annotationStyle&&"yes"===this.isDrawing&&(isErasing=!0,eraseAt(o))}),canvas.on("mouse:move",o=>{isErasing&&("eraser"===this.annotationStyle&&"yes"===this.isDrawing?eraseAt(o):isErasing=!1)}),canvas.on("mouse:up",()=>{isErasing=!1})}removeFromHistory(chapterDocIndex,obj){const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history)return;const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}canSliceObject(obj){if(!obj||!obj.isType||!obj.isType("path"))return!1;if(!obj.path||!obj.path.length||!obj.getCenterPoint)return!1;const fill=obj.fill;return!fill||"transparent"===fill||"rgba(0,0,0,0)"===fill}slicePathObject(obj,x,y,radius){const fabricLib=window.fabric;if(!fabricLib||!fabricLib.Path)return[];const commands=obj.path,center=obj.getCenterPoint(),scaleX=Math.abs(obj.scaleX||1),scaleY=Math.abs(obj.scaleY||1),angleRad=(obj.angle||0)*Math.PI/180,cos=Math.cos(angleRad),sin=Math.sin(angleRad),pathOffset=obj.pathOffset||{x:0,y:0},local=((ax,ay)=>{const dx=ax-center.x,dy=ay-center.y;return{x:(dx*cos+dy*sin)/scaleX+pathOffset.x,y:(-dx*sin+dy*cos)/scaleY+pathOffset.y}})(x,y),eraseRadius=radius+(obj.strokeWidth||1)/2,pts=[],pushPoint=(lx,ly)=>{const abs=((lx,ly)=>{const dx=(lx-pathOffset.x)*scaleX,dy=(ly-pathOffset.y)*scaleY;return{x:dx*cos-dy*sin+center.x,y:dx*sin+dy*cos+center.y}})(lx,ly);pts.push({x:abs.x,y:abs.y,erase:Math.hypot(lx-local.x,ly-local.y)<=eraseRadius})};let cur={x:0,y:0};commands.forEach(cmd=>{switch(cmd[0]){case"M":case"L":case"T":cur={x:cmd[1],y:cmd[2]},pushPoint(cmd[1],cmd[2]);break;case"C":{const c1x=cmd[1],c1y=cmd[2],c2x=cmd[3],c2y=cmd[4],ex=cmd[5],ey=cmd[6];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt*mt,w1=3*mt*mt*t,w2=3*mt*t*t,w3=t*t*t;pushPoint(w0*cur.x+w1*c1x+w2*c2x+w3*ex,w0*cur.y+w1*c1y+w2*c2y+w3*ey)}cur={x:ex,y:ey};break}case"Q":{const c1x=cmd[1],c1y=cmd[2],ex=cmd[3],ey=cmd[4];for(let i=1;i<=16;i++){const t=i/16,mt=1-t,w0=mt*mt,w1=2*mt*t,w2=t*t;pushPoint(w0*cur.x+w1*c1x+w2*ex,w0*cur.y+w1*c1y+w2*ey)}cur={x:ex,y:ey};break}}});const pieces=[];let run=[];const flushRun=()=>{if(run.length>=2){const cmds=[["M",run[0].x,run[0].y]];for(let i=1;i{p.erase?flushRun():run.push({x:p.x,y:p.y})}),flushRun(),pieces}hitTestObject(obj,x,y,radius){try{const rect=obj.getBoundingRect?obj.getBoundingRect(!0,!0):null;if(!rect)return!1;const closestX=Math.max(rect.left,Math.min(x,rect.left+rect.width)),closestY=Math.max(rect.top,Math.min(y,rect.top+rect.height));return Math.hypot(closestX-x,closestY-y)<=radius}catch(e){return!1}}buildEraserCursor(){const size=Math.max(Math.round(this.eraserWidth),12)+6,center=size/2,radius=center-3;return`url("data:image/svg+xml,${encodeURIComponent(``)}") ${center} ${center}, crosshair`}attachTextCreateListeners(chapterDocIndex,canvas){canvas&&canvas.on("mouse:down",o=>{var _a,_b;if("text"!==this.annotationStyle||"yes"!==this.isDrawing)return;const justExited=!0===canvas._kookitJustExitedText;canvas._kookitJustExitedText=!1;if(canvas.findTarget(o.e))return;if(justExited)return;const active=canvas.getActiveObject();if(active&&active.isEditing)return active.exitEditing(),void(canvas._kookitJustExitedText=!1);const pointer=canvas.getPointer(o.e),fabricLib=window.fabric;if(!fabricLib||!fabricLib.IText)return;const text=new fabricLib.IText("",{left:pointer.x,top:pointer.y,fontSize:this.textSize,fontFamily:this.textFont,fill:this.textColor,editable:!0,selectable:!0});canvas.add(text),canvas.setActiveObject(text),text.enterEditing(),null===(_a=text.hiddenTextarea)||void 0===_a||_a.focus();const subWin=canvas.getElement&&canvas.getElement().ownerDocument?canvas.getElement().ownerDocument.defaultView:null;if(subWin&&document.activeElement!==text.hiddenTextarea){try{subWin.focus()}catch(e){}null===(_b=text.hiddenTextarea)||void 0===_b||_b.focus()}this.attachITextListeners(canvas,text)})}attachITextListeners(canvas,text){if(!canvas||!text||text._kookitListenersAttached)return;text._kookitListenersAttached=!0;const finalizeText=()=>{try{text.setCoords()}catch(e){}canvas.requestRenderAll()};text.on("text:changed",finalizeText),text.on("editing:exited",()=>{canvas._kookitJustExitedText=!0,finalizeText()})}toRgba(color,alpha){if("string"!=typeof color||!color)return`rgba(255,255,0,${alpha})`;const trim=color.trim(),rgbaMatch=trim.match(/^rgba?\(\s*([\d.]+)\s*,\s*([\d.]+)\s*,\s*([\d.]+)\s*(?:,\s*([\d.]+)\s*)?\)$/i);if(rgbaMatch){return`rgba(${Math.round(parseFloat(rgbaMatch[1]))},${Math.round(parseFloat(rgbaMatch[2]))},${Math.round(parseFloat(rgbaMatch[3]))},${alpha})`}const hexMatch=trim.match(/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i);if(hexMatch){let hex=hexMatch[1];3===hex.length&&(hex=hex.split("").map(c=>c+c).join(""));return`rgba(${parseInt(hex.slice(0,2),16)},${parseInt(hex.slice(2,4),16)},${parseInt(hex.slice(4,6),16)},${alpha})`}return`rgba(255,255,0,${alpha})`}pushFabricHistory(chapterDocIndex,obj){if(!obj)return;let history=this.fabricHistoryMap.get(chapterDocIndex);history||(history=[],this.fabricHistoryMap.set(chapterDocIndex,history)),history.push(obj)}attachFabricKeyListeners(chapterDocIndex,subDoc){subDoc.addEventListener("keydown",e=>{const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas){if((e.ctrlKey||e.metaKey)&&("z"===e.key||"Z"===e.key))return e.preventDefault(),void this.undoFabric(chapterDocIndex);if("Backspace"===e.key||"Delete"===e.key){const activeObj=canvas.getActiveObject();if(activeObj&&activeObj.isEditing)return;const active=canvas.getActiveObjects();active&&active.length>0&&(e.preventDefault(),active.forEach(obj=>{canvas.remove(obj);const history=this.fabricHistoryMap.get(chapterDocIndex);if(history){const idx=history.lastIndexOf(obj);idx>=0&&history.splice(idx,1)}}),canvas.discardActiveObject(),canvas.requestRenderAll())}}})}undoFabric(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas)return;const history=this.fabricHistoryMap.get(chapterDocIndex);if(!history||0===history.length)return;const last=history.pop();last&&(canvas.remove(last),canvas.discardActiveObject(),canvas.requestRenderAll())}setBrushColor(color){this.brushColor=color,this.applyBrushToAll()}setHighlighterColor(color){this.highlighterColor=color,this.applyBrushToAll()}setHighlighterOpacity(opacity){this.highlighterOpacity=opacity,this.applyBrushToAll()}setAnnotationStyle(style){this.annotationStyle=style,this.applyBrushToAll()}setBrushWidth(width){this.brushWidth=width,this.applyBrushToAll()}setHighlighterWidth(width){this.highlighterWidth=width,this.applyBrushToAll()}setShapeType(shapeType){this.shapeType=shapeType,this.applyBrushToAll()}setShapeColor(color){this.shapeColor=color,this.applyBrushToAll()}setShapeWidth(width){this.shapeWidth=width,this.applyBrushToAll()}setEraserWidth(width){this.eraserWidth=width,this.applyBrushToAll()}setQuickErase(quickErase){this.quickErase=quickErase}setTextSize(size){this.textSize=size,this.applyBrushToAll()}setTextFont(font){this.textFont=font,this.applyBrushToAll()}setTextColor(color){this.textColor=color,this.applyBrushToAll()}setIsDrawing(isDrawing){this.isDrawing=isDrawing,this.applyBrushToAll()}applyBrushToAll(){this.fabricCanvasMap.forEach(canvas=>{this.applyFabricBrush(canvas),canvas.requestRenderAll()})}getAnnotationData(chapterDocIndex){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.toJSON)return null;const data=canvas.toJSON(["selectable","_kookitLogged"]);return data._canvasWidth=canvas.getWidth(),data._canvasHeight=canvas.getHeight(),data}restoreAnnotation(chapterDocIndex,data){return __awaiter(this,void 0,void 0,function*(){if("web"!==this.platform)return;const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(!canvas||!canvas.loadFromJSON)return;this.fabricHistoryLock.add(chapterDocIndex),this.activateFabricDocument(chapterDocIndex);const oldW=data._canvasWidth,oldH=data._canvasHeight,newW=canvas.getWidth(),newH=canvas.getHeight(),ratioX=newW/oldW,ratioY=newH/oldH,reviver=1!==ratioX||1!==ratioY?(jsonObj,fabricObj)=>{fabricObj&&("number"==typeof jsonObj.left&&fabricObj.set("left",jsonObj.left*ratioX),"number"==typeof jsonObj.top&&fabricObj.set("top",jsonObj.top*ratioY),"number"==typeof jsonObj.scaleX&&fabricObj.set("scaleX",jsonObj.scaleX*ratioX),"number"==typeof jsonObj.scaleY&&fabricObj.set("scaleY",jsonObj.scaleY*ratioY),fabricObj.setCoords&&fabricObj.setCoords(),fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj))}:(jsonObj,fabricObj)=>{fabricObj&&fabricObj.isType&&fabricObj.isType("i-text")&&this.attachITextListeners(canvas,fabricObj)};try{yield new Promise(resolve=>{canvas.loadFromJSON(data,()=>{canvas.requestRenderAll(),resolve()},reviver)}),this.fabricHistoryMap.set(chapterDocIndex,canvas.getObjects?canvas.getObjects().slice():[])}catch(e){console.warn(e)}finally{this.fabricHistoryLock.delete(chapterDocIndex)}})}activateFabricDocument(chapterDocIndex){var _a;if("web"!==this.platform)return;const subDoc=null===(_a=this.fabricDocumentProvider)||void 0===_a?void 0:_a.call(this,chapterDocIndex);if(!subDoc)return;const subWin=subDoc.defaultView,fabricLib=window.fabric;subWin&&fabricLib&&(fabricLib.document=subDoc,fabricLib.window=subWin)}disposeCanvas(chapterDocIndex,subDoc){return __awaiter(this,void 0,void 0,function*(){const canvas=this.fabricCanvasMap.get(chapterDocIndex);if(canvas&&canvas.dispose)try{canvas.dispose()}catch(e){console.warn(e)}const syncListener=this.fabricSyncListenerMap.get(chapterDocIndex);if(syncListener){try{syncListener.doc.removeEventListener("mousedown",syncListener.fn,!0),syncListener.doc.removeEventListener("touchstart",syncListener.fn,!0)}catch(e){console.warn(e)}this.fabricSyncListenerMap.delete(chapterDocIndex)}this.fabricCanvasMap.delete(chapterDocIndex),this.fabricHistoryMap.delete(chapterDocIndex),this.fabricHistoryLock.delete(chapterDocIndex)})}}class PdfRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{convertChinese:"Default",format:"PDF",isParagraphMode:"no",isReadingRuler:"no",isSpeedReading:"no"})),this.isStartFromEven="no",this.isKeepPDFBackground="no",this.pdfCrop={top:0,bottom:0,left:0,right:0},this.password="",this.pdfScale=0,this.scale=1,this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.enablePDFSelectionOptimization="no",this.scrollPDFInterval=null,this.templateChapterDocIndex=0,this.pdfTextLineHeightRecord={},this.pdfTextLineHeightFixed=null,this.getPdfScale=()=>__awaiter(this,void 0,void 0,function*(){if(this.pdfScale&&this.pdfScale>0)return this.pdfScale;let doc=this.getDocument();if("scroll"===this.readerMode&&(doc=this.getSubDocument(this.templateChapterDocIndex)),!doc)return 1;let{width:width,height:height}=yield this.chapterDocList[this.templateChapterDocIndex].text.getDimension(),viewWidth=doc.body.clientWidth,viewHeight=this.element.clientHeight;if("double"===this.readerMode){let scale="double"===this.readerMode?2:1,section=Math.floor(this.element.clientWidth/12);viewWidth=(viewWidth-(section%2==0?section:section-1))/scale}let scale=Math.min(viewWidth/width,viewHeight/height);return"scroll"===this.readerMode&&(viewWidth-=10,scale=viewWidth/width),this.pdfScale=scale,scale}),this.pdfBuffer=pdfBuffer,this.isStartFromEven=config.isStartFromEven||"no",this.pdfCrop=config.pdfCrop||{top:0,bottom:0,left:0,right:0},this.isKeepPDFBackground=config.isKeepPDFBackground||"no",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.password=config.password||"",this.scale=config.scale||1,this.backgroundColor=config.backgroundColor||"#ffffff",this.isScannedPDF=config.isScannedPDF||"no",this.platform=config.platform||"web",this.enablePDFSelectionOptimization=config.enablePDFSelectionOptimization||"no",this.annotationManager=new AnnotationManager(Object.assign({platform:this.platform,isScannedPDF:this.isScannedPDF},config)),this.annotationManager.onAnnotationChanged=chapterDocIndex=>{this.trigger("annotation-changed",[chapterDocIndex])},this.annotationManager.fabricDocumentProvider=chapterDocIndex=>this.getSubDocument(chapterDocIndex)}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let viewport,parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),"yes"===this.isStartFromEven&&"double"===this.readerMode&&(this.chapterDocList=[{label:"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:""},...this.chapterDocList]),"single"===this.readerMode&&Math.abs(this.scale)>1.4&&(this.scale=1.4),document.body.clientWidth*Math.abs(this.scale)-.4*document.body.clientWidth>document.body.clientWidth&&"double"!==this.readerMode?createIframe(element,this.isAllowScript,this.scale):createIframe(element,this.isAllowScript);let templateIndex=0,maxFrequencyItem=yield this.getTemplateChapterDoc();viewport=maxFrequencyItem.dimension,templateIndex=maxFrequencyItem.index,this.templateChapterDocIndex=templateIndex;let doc=this.getDocument();if(!doc)return;yield((element,chapterDocList,viewport,readerMode,pdfCrop)=>__awaiter(void 0,void 0,void 0,function*(){const fragment=document.createDocumentFragment();for(let index=0;index{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handlePDFScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),this.trigger("chapter-pages"),resolve()}))}getTemplateChapterDoc(){return __awaiter(this,void 0,void 0,function*(){const totalPages=this.chapterDocList.length;let keyIndices=[1,Math.floor(totalPages/4),Math.floor(totalPages/2),Math.floor(3*totalPages/4),totalPages-1].filter(idx=>idx>=0&&idx__awaiter(this,void 0,void 0,function*(){return{index:index,dimension:yield this.chapterDocList[index].text.getDimension()}})))).map(v=>({index:v.index,ratio:v.dimension.height/v.dimension.width,dimension:v.dimension})),ratioFrequency=new Map,widthFrequency=new Map;aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.set(roundedRatio,(ratioFrequency.get(roundedRatio)||0)+1);const roundedWidth=Math.round(item.dimension.width);widthFrequency.set(roundedWidth,(widthFrequency.get(roundedWidth)||0)+1)});let maxRatioCount=0;ratioFrequency.forEach(count=>{count>maxRatioCount&&(maxRatioCount=count)});let maxWidthCount=0;widthFrequency.forEach(count=>{count>maxWidthCount&&(maxWidthCount=count)});const candidates=aspectRatios.filter(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3,roundedWidth=Math.round(item.dimension.width);return ratioFrequency.get(roundedRatio)===maxRatioCount&&widthFrequency.get(roundedWidth)===maxWidthCount});let maxFrequencyItem={count:maxRatioCount,dimension:null,index:0,ratio:0};return candidates.forEach(item=>{item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem.dimension||aspectRatios.forEach(item=>{const roundedRatio=Math.round(1e3*item.ratio)/1e3;ratioFrequency.get(roundedRatio)===maxRatioCount&&item.ratio>maxFrequencyItem.ratio&&(maxFrequencyItem={count:maxRatioCount,dimension:item.dimension,index:item.index,ratio:item.ratio})}),maxFrequencyItem})}autoScrollPDF(isStart){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();this.scrollPDFInterval&&(clearInterval(this.scrollPDFInterval),this.scrollPDFInterval=null),"no"!==isStart&&"scroll"===this.readerMode&&(this.scrollPDFInterval=setInterval(()=>__awaiter(this,void 0,void 0,function*(){doc&&(yield this.handlePDFScrollEvent(doc))}),1e3))})}handlePDFScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;index0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}getPageSize(pageIndex){let doc=this.getDocument();if(!doc)return;let scale="double"===this.readerMode?2:1,section=Math.floor(doc.body.clientWidth/12),gap=section%2==0?section:section-1,subIframe=doc.querySelectorAll("iframe")[0],iframeHeight=null==subIframe?void 0:subIframe.getBoundingClientRect().height,offsetTop=0;if(void 0!==pageIndex){let subContainer=doc.querySelector("#pdf-container-"+pageIndex);subContainer&&(offsetTop=subContainer.getBoundingClientRect().top)}return{width:doc.body.clientWidth,height:this.element.clientHeight,left:getActualOffsetLeft(this.element),top:getActualOffsetTop(this.element),offsetTop:offsetTop,scrollTop:this.element.scrollTop,scrollLeft:this.element.scrollWidth/2-this.element.clientWidth/2,sectionWidth:(doc.body.clientWidth-gap)/scale,sectionHeight:iframeHeight,gap:gap}}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderPdfPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterTitle:chapterTitle,chapterDocIndex:chapterDocIndex,chapterHref:chapterHref}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderPdfPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),rangy.init(),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation(this.backgroundColor)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderPdfPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.prev()})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){yield this.next()})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}visibleText(){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),chapterDoc=this.chapterDocList[chapterDocIndex],textList=(yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue)).map(item=>item.text.trim());if("double"===this.readerMode){let nextChapterDocIndex=chapterDocIndex+1;if(nextChapterDocIndexitem.text.trim());textList=textList.concat(nextTextList)}}return textList})}audioText(){return __awaiter(this,void 0,void 0,function*(){return yield this.visibleText()})}getRestAudioText(count){return __awaiter(this,void 0,void 0,function*(){const result=[],startIndex=parseInt(this.tempLocation.chapterDocIndex||"0")+1,endIndex=Math.min(startIndex+count,this.chapterDocList.length);for(let i=startIndex;iitem.text.trim()).filter(s=>!!s);filteredText.length>0&&result.push({chapterDocIndex:i,audioText:filteredText})}return result})}chapterText(){return __awaiter(this,void 0,void 0,function*(){return(yield this.visibleText()).join(" ")})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handlePDFRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if("none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href;let chapterTitle=this.chapterDocList[chapterDocIndex].label;if(!chapterTitle){let tempChapterDocIndex=chapterDocIndex;for(;tempChapterDocIndex>=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")})}handlePDFRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleRecord(subContainers[subContainers.length-1]);else for(let index=0;index=0;){if(this.chapterDocList[tempChapterDocIndex].label){chapterTitle=this.chapterDocList[tempChapterDocIndex].label;break}tempChapterDocIndex--}}this.tempLocation.chapterTitle=chapterTitle,this.tempLocation.text="",this.trigger("page-changed")}}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}highlightAudioNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);if(doc&&(handleHighlightPDFNode(text,style,doc),"double"===this.readerMode)){let doc=this.getSubDocument(pageIndex+1);if(!doc)return;handleHighlightPDFNode(text,style,doc)}}highlightSearchNode(text,style){let pageIndex=parseInt(this.tempLocation.chapterDocIndex),doc=this.getSubDocument(pageIndex);doc&&handleHighlightSearchNode(text,style,doc)}getProgress(){return{totalPage:this.chapterDocList.length,currentPage:parseInt(this.tempLocation.chapterDocIndex||"0")+1}}getPages(){return this.chapterDocList.map((_item,index)=>index+1)}getNotePosition(){var _a;return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let selectedElement=getSelectedElement(doc);if(!selectedElement)return;let ownerDoc=selectedElement.ownerDocument,targetIframe=null===(_a=null==ownerDoc?void 0:ownerDoc.defaultView)||void 0===_a?void 0:_a.frameElement,id=(null==targetIframe?void 0:targetIframe.getAttribute("id"))||"",chapterDocIndex=id?parseInt(id.split("-").reverse()[0]):0;return Object.assign(Object.assign({},this.tempLocation),{chapterDocIndex:chapterDocIndex})})}getSubDocument(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;if(!doc)return null;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);return subIframe||(createPDFIframe(chapterDocIndex||0,doc),subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),subIframe.contentDocument}getSubIframe(chapterDocIndex){let pageArea=document.getElementById("page-area");if(!pageArea)return null;let iframe=pageArea.getElementsByTagName("iframe")[0];if(!iframe)return null;let doc=iframe.contentDocument;return doc?(iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex),iframe||(createPDFIframe(chapterDocIndex||0,doc),iframe=doc.getElementById("pdf-iframe-"+chapterDocIndex)),iframe):null}getHighlightCoords(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let pageIndex=void 0!==chapterDocIndex?chapterDocIndex:parseInt(this.tempLocation.chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return;var selectionRects=subDoc.getSelection().getRangeAt(0).getClientRects();let page=yield this.chapterDocList[pageIndex].text.getPage(),scale=yield this.getPdfScale();var viewport=page.getViewport({scale:scale});let canvas=subDoc.querySelector("canvas");var pageRect=null==canvas?void 0:canvas.getClientRects()[0];let tempRect=[];for(let i=0;iselectionRects[i].left&&(tempRect[tempRect.length-1].left=selectionRects[i].left),tempRect[tempRect.length-1].rightvalues.length?values.reduce((sum,value)=>sum+value,0)/values.length:0,filterByAverage=(items,getValue,deviationRatio)=>{if(items.length<3)return items;let averageValue=getAverage(items.map(getValue));if(!averageValue)return items;let threshold=Math.max(averageValue*deviationRatio,1),filteredItems=items.filter(item=>Math.abs(getValue(item)-averageValue)<=threshold);return filteredItems.length?filteredItems:items};let spans=Array.from(textLayer.querySelectorAll("span")).map(span=>{var _a;let rect=span.getBoundingClientRect();return{left:rect.left,top:rect.top,bottom:rect.bottom,height:rect.height,text:(null===(_a=span.textContent)||void 0===_a?void 0:_a.trim())||""}}).filter(item=>item.text&&item.height>0);if(spans.length<2)return;spans.sort((a,b)=>Math.abs(a.top-b.top)<.5?a.left-b.left:a.top-b.top);let lines=[];for(let index=0;indexline.avgHeight,.3),averageHeight=getAverage(filteredLines.map(line=>line.avgHeight).filter(height=>height>0));if(!averageHeight)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let gaps=[];for(let index=0;index0&&gaps.push(lineGap)}let filteredGaps=filterByAverage(gaps,gap=>gap,.5),requiredLineHeight=(getAverage(filteredGaps.filter(gap=>gap>=0))+averageHeight)/averageHeight;if(requiredLineHeight<=1||requiredLineHeight>2)return void textLayer.style.removeProperty("--kookit-pdf-text-line-height");let styleTag=subDoc.getElementById("kookit-pdf-text-layer-style");styleTag||(styleTag=subDoc.createElement("style"),styleTag.id="kookit-pdf-text-layer-style",styleTag.textContent="\n .textLayer span {\n line-height: var(--kookit-pdf-text-line-height, 1) !important;\n }\n ",(subDoc.head||subDoc.documentElement).appendChild(styleTag));let lineHeightKey=requiredLineHeight.toFixed(1),count=(this.pdfTextLineHeightRecord[lineHeightKey]||0)+1;this.pdfTextLineHeightRecord[lineHeightKey]=count,count>=3&&(this.pdfTextLineHeightFixed=requiredLineHeight),textLayer.style.setProperty("--kookit-pdf-text-line-height",lineHeightKey)}applyPdfCrop(subIframe,subDoc){if("scroll"===this.readerMode){subDoc.body.style.overflow="hidden";const scale=100/(100-this.pdfCrop.left-this.pdfCrop.right),compensation=1,tx=(this.pdfCrop.right-this.pdfCrop.left)*(scale/2)*compensation;subIframe.style.transformOrigin="50% 50%",subIframe.style.transform=`translateX(${tx}%) scale(${scale}) translateZ(0)`,this.pdfCrop.top>0&&(subDoc.body.style.position="relative",subDoc.body.style.bottom=this.pdfCrop.top+2+"%")}}applyAnnotationConfig(config){this.annotationManager.applyConfig(config)}handleRenderPDFChapter(chapterDocIndex,isReload=!1){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc)),isReload&&(yield this.handleUnloadPDFChapter(chapterDocIndex));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML&&!isReload)return;subDoc.body.innerHTML="";let blob=yield fetch(yield this.chapterDocList[chapterDocIndex].text.load()).then(r=>r.blob()),chapterText=yield blob.text();subDoc.body.innerHTML=chapterText;let scale=yield this.getPdfScale();yield this.chapterDocList[chapterDocIndex].text.render(subDoc,scale,this.isMobile,this,this.isKeepPDFBackground);let docLayer=subDoc.querySelector("#koodoPDFLayer");if(docLayer){if("yes"===this.isDarkMode&&(docLayer.style.filter="invert(1) hue-rotate(180deg) contrast(0.95)"),"rgba(233, 216, 188,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(100%) contrast(0.95) brightness(0.95)"),"rgba(197, 231, 207,1)"===this.backgroundColor&&"yes"===this.isScannedPDF&&(docLayer.style.filter="sepia(30%) hue-rotate(60deg) saturate(120%) brightness(95%)"),(this.pdfCrop.top>0||this.pdfCrop.left>0||this.pdfCrop.right>0)&&this.applyPdfCrop(subIframe,subDoc),"single"===this.readerMode||"double"===this.readerMode){let additionalHeight=this.element.clientHeight/2-docLayer.getBoundingClientRect().height/2;docLayer.style.marginTop=additionalHeight+"px",subIframe.style.height=docLayer.getBoundingClientRect().height+additionalHeight+"px";let noteLayer=subDoc.querySelector(".noteLayer");noteLayer&&(noteLayer.style.position="relative")}if("scroll"!==this.readerMode&&(docLayer.style.marginLeft=`calc(50% - ${docLayer.getBoundingClientRect().width/2}px)`),docLayer.style.visibility="visible","android"===this.platform&&"yes"===this.enablePDFSelectionOptimization&&this.applyPDFTextLayerLineHeight(subDoc),this.annotationManager.isCanvasEnabled()){let canvasEle=subDoc.querySelector("#fabric");canvasEle&&this.annotationManager.initCanvas(chapterDocIndex,canvasEle,docLayer,subDoc)}this.trigger("rendered",[chapterDocIndex])}})}handleUnloadPDFChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""!==subDoc.body.innerHTML&&(yield this.chapterDocList[chapterDocIndex].text.unload(),this.annotationManager.disposeCanvas(chapterDocIndex),subDoc.body.innerHTML="")})}renderPdfPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadPDFChapter(chapterDocIndex-4)),yield this.handleRenderPDFChapter(chapterDocIndex),this.handleRenderPDFChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderPDFChapter(chapterDocIndex+2),this.handleRenderPDFChapter(chapterDocIndex+3),this.activateFabricDocument(chapterDocIndex)))})}activateFabricDocument(chapterDocIndex){this.annotationManager.activateFabricDocument(chapterDocIndex)}}const ocrCache=new class{constructor(){this.db=null}isRemoteUrl(url){return url.startsWith("http://")||url.startsWith("https://")}init(){return __awaiter(this,void 0,void 0,function*(){if(!this.db)return new Promise((resolve,reject)=>{const request=indexedDB.open("OCRResourceCache",1);request.onerror=()=>reject(request.error),request.onsuccess=()=>{this.db=request.result,resolve()},request.onupgradeneeded=event=>{const db=event.target.result;if(!db.objectStoreNames.contains("resources")){db.createObjectStore("resources",{keyPath:"url"}).createIndex("timestamp","timestamp",{unique:!1})}}})})}get(url){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").get(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result||null)}):null})}set(url,data,type){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const store=this.db.transaction(["resources"],"readwrite").objectStore("resources"),entry={url:url,data:data,timestamp:Date.now(),type:type},request=store.put(entry);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}delete(url){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").delete(url);request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}clear(){return __awaiter(this,void 0,void 0,function*(){if(yield this.init(),this.db)return new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readwrite").objectStore("resources").clear();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve()})})}getAllKeys(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAllKeys();request.onerror=()=>reject(request.error),request.onsuccess=()=>resolve(request.result)}):[]})}fetchText(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.text()}const cached=yield this.get(url);if(cached&&"text"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),text=yield response.text();return this.set(url,text,"text").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),text}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchArrayBuffer(url){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url);return yield response.arrayBuffer()}const cached=yield this.get(url);if(cached&&"arraybuffer"===cached.type)return console.info(`从缓存加载: ${url}`),cached.data;console.info(`从网络下载: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();return this.set(url,arrayBuffer,"arraybuffer").catch(err=>console.warn(`缓存保存失败 (${url}):`,err)),arrayBuffer}catch(error){throw console.error(`获取资源失败 (${url}):`,error),error}})}fetchBlobURL(url,mimeType){return __awaiter(this,void 0,void 0,function*(){try{if(!this.isRemoteUrl(url)){const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer(),blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}const cached=yield this.get(url);if(cached&&"blob"===cached.type){console.info(`从缓存加载 Blob: ${url}`);const blob=new Blob([cached.data],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}console.info(`从网络下载 Blob: ${url}`);const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();this.set(url,arrayBuffer,"blob").catch(err=>console.warn(`缓存保存失败 (${url}):`,err));const blob=new Blob([arrayBuffer],{type:mimeType||"application/javascript"});return URL.createObjectURL(blob)}catch(error){throw console.error(`获取 Blob 资源失败 (${url}):`,error),error}})}getCacheStats(){return __awaiter(this,void 0,void 0,function*(){return yield this.init(),this.db?new Promise((resolve,reject)=>{const request=this.db.transaction(["resources"],"readonly").objectStore("resources").getAll();request.onerror=()=>reject(request.error),request.onsuccess=()=>{const entries=request.result,totalSize=entries.reduce((sum,entry)=>sum+("string"==typeof entry.data?entry.data.length:entry.data.byteLength),0);resolve({count:entries.length,totalSize:totalSize,keys:entries.map(e=>e.url)})}}):{count:0,totalSize:0,keys:[]}})}createCachedFetch(){const originalFetch=fetch.bind(window),cacheInstance=this;return function(input,init){return __awaiter(this,void 0,void 0,function*(){const url="string"==typeof input?input:input.toString();if(!(url.startsWith("http://")||url.startsWith("https://")))return originalFetch(input,init);if((null==init?void 0:init.method)&&"GET"!==init.method)return originalFetch(input,init);try{const cached=yield cacheInstance.get(url);if(cached){let body;console.info(`从缓存加载资源: ${url}`);let headers={};return"text"===cached.type?(body=cached.data,headers={"Content-Type":"text/plain"}):(body=cached.data,headers={"Content-Type":"application/octet-stream"}),new Response(body,{status:200,statusText:"OK (from cache)",headers:new Headers(headers)})}console.info(`从网络加载资源: ${url}`);const response=yield originalFetch(input,init),clonedResponse=response.clone();return(()=>{__awaiter(this,void 0,void 0,function*(){try{const contentType=clonedResponse.headers.get("Content-Type")||"";if(contentType.includes("text")||contentType.includes("json")||contentType.includes("javascript")||url.endsWith(".txt")||url.endsWith(".js")){const text=yield clonedResponse.text();yield cacheInstance.set(url,text,"text")}else{const arrayBuffer=yield clonedResponse.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer")}console.info(`缓存保存成功: ${url}`)}catch(err){console.warn(`缓存保存失败 (${url}):`,err)}})})(),response}catch(error){return console.warn(`缓存逻辑失败,使用原始 fetch (${url}):`,error),originalFetch(input,init)}})}}installGlobalFetchInterceptor(){"undefined"!=typeof window&&(window.fetch=this.createCachedFetch(),console.info("OCR 缓存拦截器已安装"))}createCachedWorkerBlob(originalWorkerUrl,cacheInstance){return __awaiter(this,void 0,void 0,function*(){try{const response=yield fetch(originalWorkerUrl),wrappedCode=`\n // 保存原始 importScripts\n const originalImportScripts = self.importScripts;\n\n // 创建支持缓存的 importScripts\n self.importScripts = function(...urls) {\n const cachedUrls = urls.map(url => {\n // 只处理远程 URL\n if (url.startsWith('http://') || url.startsWith('https://')) {\n // 同步获取缓存(在 Worker 中无法使用 IndexedDB,所以通过 postMessage 通信)\n // 这里暂时降级到原始行为,实际缓存在主线程的 fetch 拦截器中完成\n return url;\n }\n return url;\n });\n\n return originalImportScripts.apply(self, cachedUrls);\n };\n\n // 注入原始 worker 代码\n ${yield response.text()}\n `,blob=new Blob([wrappedCode],{type:"application/javascript"});return URL.createObjectURL(blob)}catch(error){return console.error("创建缓存 Worker 失败:",error),originalWorkerUrl}})}setupTesseractCacheProxy(){return __awaiter(this,void 0,void 0,function*(){const cacheInstance=this;return{getCachedUrl:url=>__awaiter(this,void 0,void 0,function*(){if(url.startsWith("http://")||url.startsWith("https://"))try{const cached=yield cacheInstance.get(url);if(cached){console.info(`从缓存创建 Blob URL: ${url}`);const blob=new Blob([cached.data]);return URL.createObjectURL(blob)}const response=yield fetch(url),arrayBuffer=yield response.arrayBuffer();yield cacheInstance.set(url,arrayBuffer,"arraybuffer");const blob=new Blob([arrayBuffer]);return URL.createObjectURL(blob)}catch(error){return console.warn(`缓存处理失败,使用原始 URL (${url}):`,error),url}return url})}})}restoreOriginalFetch(){console.warn("fetch 恢复功能需要在安装时保存原始引用")}};class PdfTextRender extends GeneralRender{constructor(pdfBuffer,config){super(Object.assign(Object.assign({},config),{format:"PDFTEXT"})),this.password="",this.ocrLang="standard_v5_mobile",this.paraSpacingValue=1.5,this.titleSizeValue=1.2,this.isFinishOCR=!1,this.shouldShowProgress=!1,this.pdfPageCount=0,this.bookKey="",this.performBuiltInOCR=imageUrl=>__awaiter(this,void 0,void 0,function*(){try{if("tesseract"===this.ocrEngine){let textContent=(yield this.worker.recognize(imageUrl)).data.text||"";return"en"!==detectLocalLanguage$1(textContent)&&(textContent=textContent.split("\n").map(line=>{const tokens=line.split(" ").filter(t=>""!==t);let out="";for(let i=0;ip.text).join("\n")}if("system-ocr"===this.ocrEngine){return(yield this.worker.recognize(imageUrl))+"\n"}throw new Error(`Unsupported OCR engine: ${this.ocrEngine}`)}catch(error){throw console.error("OCR Error:",error),error}}),this.extractPages=pages=>__awaiter(this,void 0,void 0,function*(){const srcDoc=this.pdfDoc,newDoc=yield window.PDFLib.PDFDocument.create(),pageIndices=(Array.isArray(pages)?pages:[pages]).map(p=>p-1).filter(i=>i>=0&&i{newDoc.addPage(page)});const newPdfBytes=yield newDoc.save();return new Blob([newPdfBytes],{type:"application/pdf"})}),this.pdfBuffer=pdfBuffer,this.password=config.password||"",this.isScannedPDF=config.isScannedPDF||"no",this.ocrLang=config.ocrLang||"standard_v5_mobile",this.paraSpacingValue=parseFloat(config.paraSpacingValue)||1.5,this.titleSizeValue=parseFloat(config.titleSizeValue)||1.2,this.cache={},this.serverRegion=config.serverRegion||"global",this.processingPromises=new Map,this.ocrEngine=config.ocrEngine||"paddle",this.externalWorker=config.externalWorker||null,this.pdfPageCount=config.pdfPageCount||0,this.getOcrCache=config.getOcrCache||((_bookKey,_chapterDocIndex)=>null),this.saveOcrCache=config.saveOcrCache||(()=>{}),this.bookKey=config.bookKey||""}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,"yes"===this.isScannedPDF&&"external-engine"===this.ocrEngine)this.chapterDocList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",text:{load:()=>__awaiter(this,void 0,void 0,function*(){return""}),render:()=>__awaiter(this,void 0,void 0,function*(){}),unload:()=>__awaiter(this,void 0,void 0,function*(){}),getPage:()=>__awaiter(this,void 0,void 0,function*(){return null}),getDimension:()=>__awaiter(this,void 0,void 0,function*(){return{width:0,height:0}}),getScale:()=>__awaiter(this,void 0,void 0,function*(){return 1}),getPageCount:()=>__awaiter(this,void 0,void 0,function*(){return 0})},href:"title"+i})),this.chapterList=Array.from({length:this.pdfPageCount},(_,i)=>({label:i+"",href:"title"+i,index:i,subitems:[]})),this.worker=this.externalWorker;else{this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc()}for(let index=0;index__awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.preProcessNextChapters(index),this.cache[index];let src="";return src=yield this.processCurrentChapter(index),this.preProcessNextChapters(index),src})}createIframe(element,this.isAllowScript);let doc=this.getDocument();if(doc){if(handleLayout(element,this.readerMode,doc),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){const srcDoc=yield window.PDFLib.PDFDocument.load(this.pdfBuffer);this.pdfDoc=srcDoc}resolve()}}))}processCurrentChapter(index){return __awaiter(this,void 0,void 0,function*(){if(this.cache[index])return this.cache[index];if(this.processingPromises.has(index))return yield this.processingPromises.get(index),this.cache[index];this.isFinishOCR=!1,this.shouldShowProgress=!0;try{const promise=this.processChapterOCR(index).finally(()=>{this.processingPromises.delete(index)});return this.processingPromises.set(index,promise),yield promise,this.cache[index]}finally{this.shouldShowProgress=!1}})}preProcessNextChapters(currentIndex){return __awaiter(this,void 0,void 0,function*(){const maxIndex=Math.min(currentIndex+5,this.chapterDocList.length-1);for(let i=currentIndex+1;i<=maxIndex;i++)if(!this.cache[i]&&!this.processingPromises.has(i)){const promise=this.processChapterOCR(i).finally(()=>{this.processingPromises.delete(i)});this.processingPromises.set(i,promise),"official-ai-ocr"!==this.ocrEngine&&"external-engine"!==this.ocrEngine&&(yield promise)}})}processChapterOCR(index){return __awaiter(this,void 0,void 0,function*(){try{const chapterDoc=this.chapterDocList[index];yield this.getTextByOCR(chapterDoc,index)}catch(error){console.error(`Failed to process OCR for chapter ${index}:`,error)}})}startFakeProgress(maxProgress=.85,duration=3e4){const totalSteps=duration/200;let step=0;const timer=setInterval(()=>{step++;const k=10/totalSteps,progress=maxProgress*(1-Math.exp(-k*step));showOCRProgress(Math.min(progress,maxProgress))},200);return()=>clearInterval(timer)}getTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(this.cache[chapterDocIndex])return this.cache[chapterDocIndex];let ocrCacheData=this.getOcrCache(this.bookKey,chapterDocIndex);if(ocrCacheData){let url=URL.createObjectURL(new Blob([ocrCacheData.text],{type:"text/html"}));return this.cache[chapterDocIndex]=url,url}const textContent=yield this.doTextByOCR(chapterDoc,chapterDocIndex),url=URL.createObjectURL(new Blob([textContent],{type:"text/html"}));return this.cache[chapterDocIndex]=url,"system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF||this.saveOcrCache(this.bookKey,chapterDocIndex,{text:textContent}),url})}doTextByOCR(chapterDoc,chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let textContent="";if("system-ocr"===this.ocrEngine&&"yes"!==this.isScannedPDF)return yield this.getTextFromDoc(chapterDoc);if("external-engine"===this.ocrEngine||"official-ai-ocr"===this.ocrEngine){let progressInterval=null;if(this.shouldShowProgress){let progress=0;const intervalTime=100,increment=.9/(5e3/intervalTime);progressInterval=setInterval(()=>{progress+=increment,progress>=.9&&(progress=.9,clearInterval(progressInterval)),showOCRProgress(progress)},intervalTime)}try{let result;if("external-engine"===this.ocrEngine)textContent=yield this.worker.recognize(chapterDocIndex,"");else if("official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang){let fileBlob=yield this.extractPages(chapterDocIndex+1),file=new File([fileBlob],chapterDocIndex+".pdf",{type:"application/pdf"});result=yield this.worker.recognize(file),textContent=result&&result.data&&result.data.text?result.data.text:""}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);result=yield this.worker.recognize(imageURL),textContent=result&&result.data&&result.data.text?result.data.text:""}if(this.shouldShowProgress&&(progressInterval&&clearInterval(progressInterval),showOCRProgress(1),this.isFinishOCR=!0),"official-ai-ocr"===this.ocrEngine&&"accurate"===this.ocrLang)return textContent}finally{this.shouldShowProgress&&progressInterval&&clearInterval(progressInterval)}}else{let page=yield chapterDoc.text.getPage(),{imageURL:imageURL}=yield convertPageToImage(page);textContent=yield this.performBuiltInOCR(imageURL)}return`\n \n \n \n \n
${textContent.split("\n").filter(para=>""!==para.trim()).map(para=>`

${para}

`).join("")}
\n `})}getTextFromDoc(chapterDoc){return __awaiter(this,void 0,void 0,function*(){let paraList=yield getTextFromPDFPage(chapterDoc,this.titleSizeValue,this.paraSpacingValue);return`\n \n \n \n \n
${paraList.length>0?paraList.map(para=>`

${para.text.trim()}

`).join(""):"Empty"}
\n `})}parse(){return __awaiter(this,void 0,void 0,function*(){try{ocrCache.installGlobalFetchInterceptor();let blob=new Blob([this.pdfBuffer]),file=new File([blob],"book",{lastModified:(new Date).getTime(),type:blob.type});if(this.book=yield makePDF(file,this.password),"tesseract"===this.ocrEngine){let workerScript=yield(url=(isElectron$1()?".":"")+"/lib/tesseractjs/worker.min.js",__awaiter(void 0,void 0,void 0,function*(){return yield(yield fetch(url)).text()})),workerUrl=URL.createObjectURL(new Blob([workerScript],{type:"application/javascript"}));const stopInitProgress=this.startFakeProgress(.85,3e4);try{const worker=yield window.Tesseract.createWorker([this.ocrLang],1,{workerPath:workerUrl,corePath:"https://unpkg.com/tesseract.js-core@6.1.2",langPath:"https://tessdata.projectnaptha.com/4.0.0_best",logger:m=>{"recognizing text"!==m.status||"number"!=typeof m.progress||this.isFinishOCR||(showOCRProgress(m.progress),1===m.progress&&(this.isFinishOCR=!0))}});yield worker.load(),this.worker=worker}finally{stopInitProgress(),showOCRProgress(1)}}if("paddle"===this.ocrEngine){const stopInitProgress=this.startFakeProgress(.85,6e4);try{const dictUrl=`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_dict.txt`,response=yield fetch(dictUrl);let dictStr=yield response.text();window.ort.env.wasm.wasmPaths="https://unpkg.com/onnxruntime-web@1.23.2/dist/",window.ort.env.wasm.proxy=!0;const localOCR=yield window["esearch-ocr"].init({det:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_det.onnx`,ratio:.75},rec:{input:`https://${"china"===this.serverRegion?"storage.koodoreader.cn":"storage.koodoreader.com"}/paddleocr/models/${this.ocrLang}/${this.ocrLang}_rec.onnx`,decodeDic:dictStr,on:(index,result,total)=>{if(this.shouldShowProgress&&total>0){const progress=(index+1)/total;showOCRProgress(progress),progress>=1&&(this.isFinishOCR=!0)}}},ort:window.ort,ortOption:{executionProviders:[{name:"webgpu"},{name:"wasm"}]}});this.worker=localOCR}finally{stopInitProgress(),showOCRProgress(1)}}"official-ai-ocr"!==this.ocrEngine&&"system-ocr"!==this.ocrEngine||(this.worker=this.externalWorker)}catch(error){throw console.error(error),error}var url})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}const makeHtmlBook=(bookStr,isTxt=!1,parserRegex="",bookLocation)=>{const bookDoc=(new DOMParser).parseFromString(isTxt?txtToHtml(bookStr,parserRegex,bookLocation):bookStr,"text/html");let chapterDomList=getTitleElement(bookDoc);0===chapterDomList.length&&(chapterDomList=getTitlefromText(bookDoc));for(let i=0;i""};return book.sections=chapterList.map(item=>({id:item.index,load:()=>{return index=item.index,__awaiter(void 0,void 0,void 0,function*(){return URL.createObjectURL(new Blob([chapterList[index].text],{type:"text/html"}))});var index},unload:()=>{item.index},size:chapterList[item.index].text.length})),book.toc=chapterList.map(item=>({label:item.label,href:"title"+item.index})).filter(item=>""!==item.label),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:parseInt(href.substring(5,href.length))}),book.resolveHrefIndex=href=>({index:parseInt(href.substring(5,href.length))}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book},getTitleElement=Element=>Array.from(Element.querySelectorAll("h1,title")),getChapterDoc=bookStr=>{let chapterDocList=[],chapterStrList=bookStr.split(" ").filter(item=>""!==item.trim()),titleList=chapterStrList.map(item=>getHFromStr(item)||getTitleFromStr(item));return chapterDocList=chapterStrList.map((item,index)=>({index:index,label:titleList[index],text:item,href:"title"+index})),chapterDocList},getHFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("h1");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitleFromStr=str=>{var _a;const headingTag=(new DOMParser).parseFromString(str,"text/html").querySelector("title");return headingTag&&(null===(_a=headingTag.textContent)||void 0===_a?void 0:_a.trim())||""},getTitlefromText=bookDoc=>{let elements=bookDoc.getElementsByTagName("*"),titleElements=Array.from(elements).filter(item=>1===item.childNodes.length&&item.childNodes[0].nodeType===Node.TEXT_NODE&&isTitle(item.textContent)),h1TitleElements=[];for(let index=0;index__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse(bookLocation));let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(bookLocation){return __awaiter(this,void 0,void 0,function*(){try{const textDecoder=new TextDecoder(this.charset),bytes=new Uint8Array(this.txtBuffer);let text=textDecoder.decode(bytes);this.book=makeHtmlBook(text,!0,this.parserRegex,bookLocation)}catch(error){throw console.error(error),error}})}refreshContent(){return __awaiter(this,void 0,void 0,function*(){yield this.parse({refresh:!0});let parser=new GeneralParser(this.book);return this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),yield this.record(),this.chapterSizeCache=null,this.chapterList})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse({refresh:!0})),yield getCache(this.book)})}getMetadata(txtBuffer){return __awaiter(this,void 0,void 0,function*(){try{const CHUNK_SIZE=4096,bufferLength=txtBuffer.byteLength,sizeToRead=Math.min(bufferLength,CHUNK_SIZE),chunkArray=new Uint8Array(txtBuffer,0,sizeToRead);const charset=chardet.detect(chunkArray)||"utf8";return this.charset=charset,{charset:charset}}catch(error){return console.error("Error detecting charset:",error),this.charset="utf8",{charset:"utf8"}}})}}const makeComicBook=({entries:entries,loadBlob:loadBlob,getSize:getSize},file)=>{const cache=new Map,urls=new Map,exts=[".jpg",".jpeg",".png",".gif",".webp",".svg",".bmp",".tif",".tiff",".jfif",".jpe",".heic"],files=entries.map(entry=>entry.filename).filter(name=>exts.some(ext=>name.endsWith(ext))).sort((a,b)=>a.localeCompare(b,void 0,{numeric:!0,sensitivity:"base"})),book={getCover:()=>loadBlob(files[0])};return book.metadata={title:file.name},book.sections=files.map((name,index)=>({id:name,load:()=>(async name=>{if(cache.has(name))return cache.get(name);const src=URL.createObjectURL(await loadBlob(name)),page=URL.createObjectURL(new Blob([`
`],{type:"text/html"}));return urls.set(name,[src,page]),cache.set(name,page),page})(name),unload:()=>(name=>{urls.get(name)?.forEach?.(url=>URL.revokeObjectURL(url)),urls.delete(name),cache.delete(name)})(name),size:getSize(name)})),book.toc=files.map((name,index)=>({label:name.split("/").pop()||name,href:name})),book.rendition={layout:"pre-paginated"},book.resolveHref=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.resolveHrefIndex=href=>({index:book.sections.findIndex(s=>s.id===href)}),book.splitTOCHref=href=>[href,null],book.getTOCFragment=doc=>doc.documentElement,book};class ComicRender extends GeneralRender{constructor(comicBuffer,config){super(config),this.scrollComicInterval=null,this.comicBuffer=comicBuffer,this.readerMode=config.readerMode,this.format=config.format,this.chapterList=[],this.chapterDocList=[],this.book="",this.element="",this.rpc,this.getTarBuffer=config.getTarBuffer,this.getZipBuffer=config.getZipBuffer,this.getTarEntries=config.getTarEntries,this.getZipEntries=config.getZipEntries,this.filePath=config.filePath}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){if(this.element=element,!this.book)try{yield this.parse()}catch(error){return console.error(error),void reject(error)}let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();if(!doc)return;yield this.createComicContainer(doc);let scrollTimeout=null;"scroll"===this.readerMode?this.element.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),100)}):doc.addEventListener("scroll",e=>{scrollTimeout&&clearTimeout(scrollTimeout),scrollTimeout=setTimeout(()=>__awaiter(this,void 0,void 0,function*(){yield this.handleComicScrollEvent(doc),yield this.record()}),200)}),handlePDFLayout(0,this.readerMode,doc),resolve()}))}createComicContainer(doc){return __awaiter(this,void 0,void 0,function*(){const fragment=doc.createDocumentFragment(),aspectRatio=yield this.getTemplateAspectRatio();for(let index=0;index{frequency.set(ratio,(frequency.get(ratio)||0)+1)});let maxRatio=ratios[0],maxCount=0;return frequency.forEach((count,ratio)=>{count>maxCount&&(maxCount=count,maxRatio=ratio)}),maxRatio})}getImageMeta(blob){return __awaiter(this,void 0,void 0,function*(){let url=URL.createObjectURL(blob);const img=new Image;img.src=url;try{yield img.decode()}catch(error){console.error(error)}const{naturalWidth:naturalWidth,naturalHeight:naturalHeight}=img;return URL.revokeObjectURL(url),{width:naturalWidth,height:naturalHeight}})}handleComicScrollEvent(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");for(let index=0;indexsetTimeout(r,200));const loader=yield this.makeRarLoader();this.book=makeComicBook(loader,file)}else if("7z"===archiveType||"cb7"===archiveType){const loader=yield this.make7zLoader();this.book=makeComicBook(loader,file)}}catch(error){throw console.error(error),error}})}detectArchiveType(){const bytes=new Uint8Array(this.comicBuffer);if(bytes.length<4)return this.format.toLocaleLowerCase();if(80===bytes[0]&&75===bytes[1]){const sig=[bytes[2],bytes[3]];if(3===sig[0]&&4===sig[1]||5===sig[0]&&6===sig[1]||7===sig[0]&&8===sig[1])return"zip"}return 82===bytes[0]&&97===bytes[1]&&114===bytes[2]&&33===bytes[3]?"rar":55===bytes[0]&&122===bytes[1]&&188===bytes[2]&&175===bytes[3]?"7z":this.comicBuffer.byteLength>=265&&"ustar"===new TextDecoder("utf8").decode(new Uint8Array(this.comicBuffer,257,5))?"tar":this.format.toLocaleLowerCase()}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}makeZipStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getZipEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getZipBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeTarStreamLoader(filePath){return __awaiter(this,void 0,void 0,function*(){const entries=yield this.getTarEntries(filePath);return{entries:entries.map(item=>({filename:item.fileName})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);return entry?entry.fileName:""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=entries.find(item=>item.fileName===name);if(entry){let buffer=yield this.getTarBuffer(entry.entryPath,filePath);return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=entries.find(item=>item.fileName===name);if(entry)return entry.size||1}}})}makeZipLoader(file){return __awaiter(this,void 0,void 0,function*(){let zip=yield JSZip.loadAsync(file);const entries=zip.files;return{entries:Object.values(entries).map(item=>({filename:item.name})),loadText:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);return entry?entry.async("string"):""}),loadBlob:name=>__awaiter(this,void 0,void 0,function*(){let entry=zip.file(name);if(entry){let buffer=yield entry.async("arraybuffer");return new Blob([buffer])}return new Blob([new ArrayBuffer(0)])}),getSize:name=>{let entry=zip.file(name);if(entry)return entry._data.uncompressedSize||1}}})}makeTarLoader(){return __awaiter(this,void 0,void 0,function*(){const entries=yield untar(this.comicBuffer),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.readAsString()),loadBlob=load((entry,type)=>entry.blob);return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}makeRarLoader(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{var buffers=[this.comicBuffer],dataToPass=[{name:"book.rar",content:this.comicBuffer}];this.rpc.transferables=buffers,this.rpc.unrar(dataToPass,null,0).then(ret=>{let entries=this.getRarEntries(ret.ls);const map=new Map(Object.values(entries).map(entry=>[entry.fullFileName,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.fullFileName),loadBlob=load((entry,type)=>new Blob([entry.fileContent]));resolve({entries:Object.values(entries).map(item=>({filename:item.fullFileName})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.fileSize)&&void 0!==_b?_b:1}})}).catch(err=>{console.error(err),reject(err)})})})}make7zLoader(){return __awaiter(this,void 0,void 0,function*(){if(!window.wasmBinary){const response=yield fetch("./lib/7z-wasm/7zz.wasm",{credentials:"same-origin"});if(!response.ok)throw"failed to load wasm binary file at './lib/7z-wasm/7zz.wasm'";window.wasmBinary=yield response.arrayBuffer()}const sevenZip=yield window.SevenZip({wasmBinary:window.wasmBinary}),archiveData=new Uint8Array(this.comicBuffer),stream=sevenZip.FS.open("archive.cb7","w+");sevenZip.FS.write(stream,archiveData,0,archiveData.length),sevenZip.FS.close(stream),sevenZip.callMain(["x","archive.cb7"]);const loader=sevenZip.FS,entries=this.get7zEntries(loader.lookupPath("/").node),map=new Map(entries.map(entry=>[entry.name,entry])),load=f=>(name,...args)=>map.has(name)?f(map.get(name),...args):null,loadText=load(entry=>entry.name),loadBlob=load((entry,type)=>new Blob([entry.buffer]));return{entries:entries.map(item=>({filename:item.name})),loadText:loadText,loadBlob:loadBlob,getSize:name=>{var _a,_b;return null!==(_b=null===(_a=map.get(name))||void 0===_a?void 0:_a.size)&&void 0!==_b?_b:1}}})}getRarEntries(Node){const list=Object.keys(Node);let entries=[];for(let index=0;index"archive.cb7"!=item&&"dev"!=item&&"home"!=item&&"proc"!=item&&"tmp"!=item);let entries=[];for(let index=0;index=this.chapterDocList.length||chapterDocIndex<0)return;let doc=this.getDocument();if(!doc)return;let subIframe=doc.getElementById("pdf-iframe-"+chapterDocIndex);subIframe||(subIframe=createPDFIframe(chapterDocIndex,doc));let subDoc=null==subIframe?void 0:subIframe.contentDocument;if(!subDoc)return;if(subDoc.body.innerHTML)return;let chapterUrl=yield this.chapterDocList[chapterDocIndex].text.load(),res=yield fetch(chapterUrl),chapterText=yield res.text();subDoc.body.innerHTML=chapterText,subDoc.body.style.margin="0",subDoc.body.style.height="100%",subDoc.documentElement.style.height="100%",this.trigger("rendered",[chapterDocIndex])})}handleUnloadComicChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){if(chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0)return;let subDoc=this.getSubDocument(chapterDocIndex);subDoc&&""===subDoc.body.innerHTML||(yield this.chapterDocList[chapterDocIndex].text.unload(),subDoc&&(subDoc.body.innerHTML=""))})}renderComicPage(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||(chapterDocIndex>3&&(yield this.handleUnloadComicChapter(chapterDocIndex-4)),yield this.handleRenderComicChapter(chapterDocIndex),this.handleRenderComicChapter(chapterDocIndex+1),"ios"!==this.platform&&(this.handleRenderComicChapter(chapterDocIndex+2),this.handleRenderComicChapter(chapterDocIndex+3)))})}goToChapterIndex(targetChapterIndex){return __awaiter(this,void 0,void 0,function*(){this.chapterDocList.length>0&&(yield this.goToChapter(targetChapterIndex,this.chapterDocList[targetChapterIndex].href,this.chapterDocList[targetChapterIndex].label))})}goToChapter(chapterDocIndex,_chapterHref,_chapterTitle){return __awaiter(this,void 0,void 0,function*(){"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--;let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&(yield this.renderComicPage(chapterDocIndex),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(chapterDocIndex))})}getPositionByChapter(chapterDocIndex){return{percentage:chapterDocIndex/this.chapterDocList.length,chapterDocIndex:chapterDocIndex+"",chapterHref:this.chapterDocList[chapterDocIndex].href,chapterTitle:this.chapterDocList[chapterDocIndex].label,text:""}}goToPercentage(percentage){return __awaiter(this,void 0,void 0,function*(){if(this.chapterDocList.length>0){let chapterIndex=1===percentage?this.chapterDocList.length-1:Math.floor(this.chapterDocList.length*percentage);yield this.goToChapter(chapterIndex,this.chapterDocList[chapterIndex].href,this.chapterDocList[chapterIndex].label)}})}goToPosition(bookLocationStr){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();if(!doc||!iframe)return;let bookLocation=JSON.parse(bookLocationStr);void 0===bookLocation.chapterDocIndex&&(bookLocation.chapterDocIndex=0),this.tempLocation={text:bookLocation.text,chapterTitle:bookLocation.chapterTitle,chapterDocIndex:bookLocation.chapterDocIndex,chapterHref:bookLocation.chapterHref,count:bookLocation.count,page:bookLocation.page,percentage:bookLocation.percentage};let{chapterDocIndex:chapterDocIndex}=bookLocation;"double"===this.readerMode&&chapterDocIndex%2==1&&chapterDocIndex--,yield this.renderComicPage(parseInt(chapterDocIndex)),"scroll"===this.readerMode&&(iframe.height=doc.body.scrollHeight+"px",iframe.height=doc.body.scrollHeight+300+"px"),yield handleScrollPDFPosition(parseInt(chapterDocIndex),this.readerMode,doc),yield this.recordByChapter(parseInt(chapterDocIndex)),this.addPageAnimation()})}waitForScrollEnd(timeoutMs=500){return new Promise(resolve=>{const element=this.element;let lastTop=element.scrollTop,stableCount=0;const started=Date.now(),timer=setInterval(()=>{if(Date.now()-started>timeoutMs||element.scrollTop===lastTop){if(stableCount++,stableCount>=2||Date.now()-started>timeoutMs)return clearInterval(timer),void resolve()}else stableCount=0;lastTop=element.scrollTop},50)})}prev(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:-(this.element.clientHeight-50),behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)-("double"===this.readerMode?2:1))),yield this.record())})}next(platform){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument(),iframe=this.getIframe();doc&&iframe&&("scroll"===this.readerMode?(this.element.scrollBy({left:0,top:this.element.clientHeight-50,behavior:"smooth"}),yield this.waitForScrollEnd()):("ios"===platform?yield handleIOSScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile,parseInt(this.tempLocation.chapterDocIndex||"0"),this.readerMode):yield handleScrollPage(this.element,this.animation,-1,doc,this.flipToNextPage,this.flipToPrevPage,this.isMobile),yield this.renderComicPage(parseInt(this.tempLocation.chapterDocIndex)+("double"===this.readerMode?2:1))),yield this.record())})}goToNeighborChapter(direction){return __awaiter(this,void 0,void 0,function*(){let doc=this.getDocument();if(!doc)return;let currentIndex=parseInt(this.tempLocation.chapterDocIndex||"0");isNaN(currentIndex)&&(currentIndex=0);let step="double"===this.readerMode?2:1,target=currentIndex+direction*step;"double"===this.readerMode&&target%2==1&&target--,"double"===this.readerMode&&target>this.chapterDocList.length-1&&(target=this.chapterDocList.length-1,target%2==1&&target--),target<0||target>this.chapterDocList.length-1||target===currentIndex||(yield this.renderComicPage(target),yield handleScrollPDFPosition(target,this.readerMode,doc),this.handleComicRecordByIndex(target))})}prevChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.prev():yield this.goToNeighborChapter(-1)})}nextChapter(){return __awaiter(this,void 0,void 0,function*(){"scroll"!==this.readerMode?yield this.next():yield this.goToNeighborChapter(1)})}goToPage(targetPage){return __awaiter(this,void 0,void 0,function*(){let chapterDocIndex=Math.floor(targetPage-1);chapterDocIndex>=this.chapterDocList.length&&(chapterDocIndex=this.chapterDocList.length-1),chapterDocIndex<0&&(chapterDocIndex=0),yield this.goToChapter(chapterDocIndex,this.chapterDocList[chapterDocIndex].href,this.chapterDocList[chapterDocIndex].label)})}record(){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3)));let doc=this.getDocument();doc&&(yield this.handleComicRecord(doc))})}recordByChapter(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){"none"!==this.animation&&"yes"!==this.isMobile&&(yield new Promise(r=>setTimeout(r,1e3))),chapterDocIndex>=this.chapterDocList.length||chapterDocIndex<0||this.handleComicRecordByIndex(chapterDocIndex)})}handleComicRecordByIndex(chapterDocIndex){chapterDocIndex!==parseInt(this.tempLocation.chapterDocIndex)&&(this.tempLocation.chapterDocIndex=chapterDocIndex+"",this.tempLocation.percentage=1===this.chapterDocList.length?"1":chapterDocIndex/(this.chapterDocList.length-1)+"",this.tempLocation.chapterHref=this.chapterDocList[chapterDocIndex].href,this.tempLocation.chapterTitle=this.chapterDocList[chapterDocIndex].label,this.tempLocation.text="",this.trigger("page-changed"))}handleComicRecord(doc){return __awaiter(this,void 0,void 0,function*(){let subContainers=doc.querySelectorAll(".pdf-container");if(subContainers.length>0&&isPDFScrolledIntoView(this.element,subContainers[subContainers.length-1],this.readerMode,doc))this.handleComicRecordByContainer(subContainers[subContainers.length-1]);else for(let index=0;indexthis.chapterDocList.length-1){if(null!=chapterDocIndex)return[];if(chapterDocIndex=parseInt(this.tempLocation.chapterDocIndex||"0"),isNaN(chapterDocIndex)&&(chapterDocIndex=0),chapterDocIndex<0||chapterDocIndex>this.chapterDocList.length-1)return[]}let indices="double"===this.readerMode&&chapterDocIndex%2==0?[chapterDocIndex,chapterDocIndex+1]:[chapterDocIndex],urls=[];for(const index of indices){const url=yield this.getComicImageUrl(index);url&&urls.push(url)}return urls})}getComicImageUrl(chapterDocIndex){return __awaiter(this,void 0,void 0,function*(){let subDoc=this.getSubDocument(chapterDocIndex);if(!subDoc)return"";if(!subDoc.querySelector("img")&&(yield this.handleRenderComicChapter(chapterDocIndex),subDoc=this.getSubDocument(chapterDocIndex),!subDoc))return"";let img=subDoc.querySelector("img");return img&&img.src?img.src:""})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());const coverBlob=yield this.book.getCover();var reader=new FileReader;reader.readAsDataURL(coverBlob),reader.onloadend=()=>{resolve({cover:reader.result})}}catch(error){console.error(error),reject(error)}}))})}}const trim=str=>str?.trim()?.replace(/\s{2,}/g," "),getElementText=el=>trim(el?.textContent),NS={XLINK:"http://www.w3.org/1999/xlink",EPUB:"http://www.idpf.org/2007/ops"},MIME_XML="application/xml",MIME_XHTML="application/xhtml+xml",STYLE={strong:["strong","self"],emphasis:["em","self"],style:["span","self"],a:"anchor",strikethrough:["s","self"],sub:["sub","self"],sup:["sup","self"],code:["code","self"],image:"image"},POEM={epigraph:["blockquote"],subtitle:["h2",STYLE],"text-author":["p",STYLE],date:["p",STYLE],stanza:"stanza"},SECTION={title:["header",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["blockquote","self"],image:"image",annotation:["aside"],section:["section","self"],p:["p",STYLE],poem:["blockquote",POEM],subtitle:["h2",STYLE],cite:["blockquote","self"],"empty-line":["br"],table:["table",{tr:["tr",["align"]],th:["th",["colspan","rowspan","align","valign"]],td:["td",["colspan","rowspan","align","valign"]]}],"text-author":["p",STYLE]};POEM.epigraph.push(SECTION);const BODY={image:"image",title:["section",{p:["h1",STYLE],"empty-line":["br"]}],epigraph:["section",SECTION],section:["section",SECTION]},getImageSrc=el=>{const href=el.getAttributeNS(NS.XLINK,"href"),[,id]=href.split("#"),bin=el.getRootNode().getElementById(id);return bin?`data:${bin.getAttribute("content-type")};base64,${bin.textContent}`:href};class FB2Converter{constructor(fb2){this.fb2=fb2,this.doc=document.implementation.createDocument(NS.XHTML,"html")}image(node){const el=this.doc.createElement("img");return el.alt=node.getAttribute("alt"),el.title=node.getAttribute("title"),el.setAttribute("src",getImageSrc(node)),el}anchor(node){const el=this.convert(node,{a:["a",STYLE]});return el.setAttribute("href",node.getAttributeNS(NS.XLINK,"href")),"note"===node.getAttribute("type")&&el.setAttributeNS(NS.EPUB,"epub:type","noteref"),el}stanza(node){const el=this.convert(node,{stanza:["p",{title:["header",{p:["strong",STYLE],"empty-line":["br"]}],subtitle:["p",STYLE]}]});for(const child of node.children)"v"===child.nodeName&&(el.append(this.doc.createTextNode(child.textContent)),el.append(this.doc.createElement("br")));return el}convert(node,def){if(3===node.nodeType)return this.doc.createTextNode(node.textContent);if(4===node.nodeType)return this.doc.createCDATASection(node.textContent);if(8===node.nodeType)return this.doc.createComment(node.textContent);const d=def?.[node.nodeName];if(!d)return null;if("string"==typeof d)return this[d](node);const[name,opts]=d,el=this.doc.createElement(name);if(node.id&&(el.id=node.id),el.classList.add(node.nodeName),Array.isArray(opts))for(const attr of opts)el.setAttribute(attr,node.getAttribute(attr));const childDef="self"===opts?def:Array.isArray(opts)?null:opts;let child=node.firstChild;for(;child;){const childEl=this.convert(child,childDef);childEl&&el.append(childEl),child=child.nextSibling}return el}}const style=URL.createObjectURL(new Blob(['\n@namespace epub "http://www.idpf.org/2007/ops";\nbody > img, section > img {\n display: block;\n margin: auto;\n}\n.title {\n text-align: center;\n}\nbody > section > .title, body.notesBodyType > .title {\n margin: 3em 0;\n}\nbody.notesBodyType > section .title {\n text-align: left;\n margin: 1em 0;\n}\np {\n text-indent: 1em;\n margin: 0;\n}\n:not(p) + p, p:first-child {\n text-indent: 0;\n}\n.poem p {\n text-indent: 0;\n margin: 1em 0;\n}\n.text-author, .date {\n text-align: end;\n}\n.text-author:before {\n content: "—";\n}\ntable {\n border-collapse: collapse;\n}\ntd, th {\n padding: .25em;\n}\na[epub|type~="noteref"] {\n font-size: .75em;\n vertical-align: super;\n}\nbody:not(.notesBodyType) > .title, body:not(.notesBodyType) > .epigraph {\n margin: 3em 0;\n}\n'],{type:"text/css"})),dataID="data-foliate-id",makeFB2=async blob=>{const book={},doc=await(async blob=>{const buffer=await blob.arrayBuffer(),str=new TextDecoder("utf-8").decode(buffer),parser=new DOMParser,doc=parser.parseFromString(str,MIME_XML),encoding=doc.xmlEncoding||str.match(/^<\?xml\s+version\s*=\s*["']1.\d+"\s+encoding\s*=\s*["']([A-Za-z0-9._-]*)["']/)?.[1];if(encoding&&"utf-8"!==encoding.toLowerCase()){const str=new TextDecoder(encoding).decode(buffer);return parser.parseFromString(str,MIME_XML)}return doc})(blob),converter=new FB2Converter(doc),$=x=>doc.querySelector(x),$$=x=>[...doc.querySelectorAll(x)],getPerson=el=>{const nick=getElementText(el.querySelector("nickname"));if(nick)return nick;const first=getElementText(el.querySelector("first-name")),middle=getElementText(el.querySelector("middle-name")),last=getElementText(el.querySelector("last-name"));return{name:[first,middle,last].filter(x=>x).join(" "),sortAs:last?[last,[first,middle].filter(x=>x).join(" ")].join(", "):null}},getDate=el=>el?.getAttribute("value")??getElementText(el),annotation=$("title-info annotation");book.metadata={title:getElementText($("title-info book-title")),identifier:getElementText($("document-info id")),language:getElementText($("title-info lang")),author:$$("title-info author").map(getPerson),translator:$$("title-info translator").map(getPerson),producer:$$("document-info author").map(getPerson).concat($$("document-info program-used").map(getElementText)),publisher:getElementText($("publish-info publisher")),published:getDate($("title-info date")),modified:getDate($("document-info date")),description:annotation?converter.convert(annotation,{annotation:["div",SECTION]}).innerHTML:null,subject:$$("title-info genre").map(getElementText)},book.getCover=()=>fetch(getImageSrc($("coverpage image"))).then(res=>res.blob());const bodyData=Array.from(doc.querySelectorAll("body"),body=>{const converted=converter.convert(body,{body:["body",BODY]});return[Array.from(converted.children,el=>{const ids=[el,...el.querySelectorAll("[id]")].map(el=>el.id);return{el:el,ids:ids}}),converted]}),sectionData=bodyData[0][0].map(({el:el,ids:ids})=>({ids:ids,titles:Array.from(el.querySelectorAll(":scope > section > .title"),(el,index)=>(el.setAttribute(dataID,index),{title:getElementText(el),index:index})),el:el})).concat(bodyData.slice(1).map(([sections,body])=>{const ids=sections.map(s=>s.ids).flat();return body.classList.add("notesBodyType"),{ids:ids,el:body,linear:"no"}})).map(({ids:ids,titles:titles,el:el,linear:linear})=>{const str=(html=el.outerHTML,`\n\n \n ${html}\n`);var html;const blob=new Blob([str],{type:MIME_XHTML}),url=URL.createObjectURL(blob);return{ids:ids,title:trim(el.querySelector(".title, .subtitle, p")?.textContent??(el.classList.contains("title")?el.textContent:"")),titles:titles,load:()=>url,createDocument:()=>(new DOMParser).parseFromString(str,MIME_XHTML),size:blob.size-Array.from(el.querySelectorAll("[src]"),el=>el.getAttribute("src")?.length??0).reduce((a,b)=>a+b,0),linear:linear}}),idMap=new Map;return book.sections=sectionData.map((section,index)=>{const{ids:ids,load:load,createDocument:createDocument,size:size,linear:linear}=section;for(const id of ids)id&&idMap.set(id,index);return{id:index,load:load,createDocument:createDocument,size:size,linear:linear}}),book.toc=sectionData.map(({title:title,titles:titles},index)=>{const id=index.toString();return{label:title,href:id,subitems:titles?.length?titles.map(({title:title,index:index})=>({label:title,href:`${id}#${index}`})):null}}).filter(item=>item),book.resolveHref=href=>{const[a,b]=href.split("#");return a?{index:Number(a),anchor:doc=>doc.querySelector(`[${dataID}="${b}"]`)}:{index:idMap.get(b),anchor:doc=>doc.getElementById(b)}},book.resolveHrefIndex=href=>{const[a,b]=href.split("#");return a?{index:Number(a)}:{index:idMap.get(b)}},book.splitTOCHref=href=>href?.split("#")?.map(x=>Number(x))??[],book.getTOCFragment=(doc,id)=>doc.querySelector(`[${dataID}="${id}"]`),book};class Fb2Render extends GeneralRender{constructor(fb2Buffer,config){super(Object.assign(Object.assign({},config),{format:"FB2"})),this.fb2Buffer=fb2Buffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){try{let blob=new Blob([this.fb2Buffer]);this.book=yield makeFB2(blob)}catch(error){throw console.error(error),error}})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}getMetadata(){return __awaiter(this,void 0,void 0,function*(){try{this.book||(yield this.parse());let parser=new GeneralParser(this.book);return yield parser.getMetadata()}catch(error){throw console.error(error),error}})}}class CacheRender extends GeneralRender{constructor(cacheBuffer,config){super(Object.assign(Object.assign({},config),{format:"CACHE"})),this.cacheBuffer=cacheBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book=yield makeCacheBook(this.cacheBuffer);let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}}class DocxRender extends GeneralRender{constructor(docxBuffer,config){super(Object.assign(Object.assign({},config),{format:"DOCX"})),this.docxBuffer=docxBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{mammoth.convertToHtml({arrayBuffer:this.docxBuffer}).then(res=>__awaiter(this,void 0,void 0,function*(){this.book=makeHtmlBook(res.value,!1),resolve()}))}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class MdRender extends GeneralRender{constructor(mdBuffer,config){super(Object.assign(Object.assign({},config),{format:"MD"})),this.mdBuffer=mdBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.mdBuffer],{type:"text/plain"}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let docStr=yield marked(null===(_a=evt.target)||void 0===_a?void 0:_a.result);this.book=makeHtmlBook(docStr,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class HtmlRender extends GeneralRender{constructor(htmlBuffer,config){super(config),this.htmlBuffer=htmlBuffer}renderTo(element){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){this.element=element,this.book||(yield this.parse());let parser=new GeneralParser(this.book);this.chapterList=yield parser.getChapter(this.book.toc),this.chapterDocList=yield parser.getChapterDoc(),createIframe(element,this.isAllowScript);let doc=this.getDocument();doc&&(handleLayout(element,this.readerMode,doc),resolve())}))}parse(){return __awaiter(this,void 0,void 0,function*(){return new Promise((resolve,reject)=>{try{var blob=new Blob([this.htmlBuffer],{type:mimetype[this.format.toLocaleLowerCase()]}),reader=new FileReader;reader.onload=evt=>__awaiter(this,void 0,void 0,function*(){var _a;let html=null===(_a=evt.target)||void 0===_a?void 0:_a.result;"MHTML"===this.format&&(html=mhtml2html.convert(html).window.document.documentElement.innerHTML),this.book=makeHtmlBook(html,!1),resolve()}),reader.readAsText(blob,"UTF-8")}catch(error){console.error(error),reject(error)}})})}preCache(){return __awaiter(this,void 0,void 0,function*(){return this.book||(yield this.parse()),yield getCache(this.book)})}}class Book{constructor(key,name,author,description,md5,cover,format,publisher,size,page,path,charset){this.key=key,this.name=name,this.author=author,this.description=description,this.md5=md5,this.cover=cover,this.format=format,this.publisher=publisher,this.size=size,this.page=page,this.path=path,this.charset=charset}}var _a;class BookHelper{static generateBook(bookName,extension,md5,size,path,file_content,rendition){return new Promise((resolve,reject)=>__awaiter(this,void 0,void 0,function*(){try{let key,name,author,publisher,description,charset,page,metadata,cover="";switch([name,author,description,publisher,charset,page]=[bookName,"","","","",0],extension){case"pdf":case"epub":case"mobi":case"azw":case"azw3":case"fb2":metadata=yield rendition.getMetadata(),[name,author,description,publisher,cover]=[metadata.name||bookName,metadata.author||"",metadata.description||"",metadata.publisher||"",metadata.cover||""];break;case"cbr":case"cbt":case"cbz":case"cb7":metadata=yield rendition.getMetadata(),cover=metadata.cover;break;case"txt":metadata=yield rendition.getMetadata(file_content),charset=metadata.charset}let format=extension.toUpperCase();key=(new Date).getTime()+"",resolve(new Book(key,name,author,description,md5,cover,format,publisher,size,page,path,charset))}catch(error){console.error(error),reject(error)}}))}}_a=BookHelper,BookHelper.getRendition=(result,config,Kookit)=>{let rendition,format=config.format.toUpperCase();var src,dst;return"CACHE"===format?rendition=new Kookit.CacheRender(result,config):"MOBI"===format||"AZW3"===format||"AZW"===format?rendition=new Kookit.MobiRender(result,config):"EPUB"===format?rendition=new Kookit.EpubRender(result,config):"TXT"===format?rendition=new Kookit.TxtRender(result,config):"MD"===format?rendition=new Kookit.MdRender(result,config):"PDF"===format?"yes"===config.isConvertPDF?("yes"===config.isScannedPDF&&"external-engine"===config.ocrEngine&&(config.externalWorker={recognize:_a.getPDFOcrResult}),rendition=new Kookit.PdfTextRender(result,config)):rendition=new Kookit.PdfRender(result,config):"FB2"===format?rendition=new Kookit.Fb2Render(result,config):"DOCX"===format?rendition=new Kookit.DocxRender(result,config):"HTML"===format||"XHTML"===format||"MHTML"===format||"HTM"===format||"XML"===format?rendition=new Kookit.HtmlRender(result,config):"CBR"!==format&&"CBT"!==format&&"CBZ"!==format&&"CB7"!==format||(rendition=new Kookit.ComicRender((src=result,dst=new ArrayBuffer(src.byteLength),new Uint8Array(dst).set(new Uint8Array(src)),dst),config)),rendition},BookHelper.initMobileBook=(bookUrl,config)=>__awaiter(void 0,void 0,void 0,function*(){try{if(window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent})),"yes"===config.isConvertPDF&&"yes"===config.isScannedPDF&&"PDF"===config.format.toUpperCase()&&"external-engine"===config.ocrEngine)window.file_content=new ArrayBuffer(0);else{const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();window.ReactNativeWebView.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content}let rendition=_a.getRendition(window.file_content,Object.assign(Object.assign({},config),{isMobile:"yes"}),window.Kookit);window.rendition=rendition;let element=document.getElementById("page-area");config.format&&"TXT"===config.format.toUpperCase()?yield window.rendition.renderTo(element,config.bookLocation):yield window.rendition.renderTo(element),window.rendition.on("rendered",chapterDocIndex=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());"PDF"===config.format&&chapterDocIndex&&(position.chapterDocIndex=chapterDocIndex+""),window.ReactNativeWebView.postMessage(JSON.stringify({event:"content-loaded",bookLocation:position,progress:progress}))}));const throttledPageChanged=function(fn,wait){let lastTime=0,timeout=null,lastArgs=null;return function(...args){const now=Date.now();now-lastTime>=wait?(lastTime=now,fn.apply(this,args)):(clearTimeout(timeout),lastArgs=args,timeout=setTimeout(()=>{lastTime=Date.now(),fn.apply(this,null!=lastArgs?lastArgs:[])},wait-(now-lastTime)))}}(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"page-changed",bookLocation:position,progress:progress}))}),3e3);window.rendition.on("page-changed",()=>{throttledPageChanged()}),window.rendition.on("chapter-pages",()=>{window.ReactNativeWebView.postMessage(JSON.stringify({event:"chapter-pages",pages:window.rendition.getPages()}))}),window.rendition.on("scroll-text",()=>__awaiter(void 0,void 0,void 0,function*(){setTimeout(()=>__awaiter(void 0,void 0,void 0,function*(){let position=Object.assign({},window.rendition.getPosition()),progress=Object.assign({},yield window.rendition.getProgress());window.ReactNativeWebView.postMessage(JSON.stringify({event:"scroll-text",bookLocation:position,progress:progress}))}),1e3)})),window.ReactNativeWebView.postMessage(JSON.stringify({event:"book-inited",chapterList:window.rendition.getChapter()}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.addMobileBook=(bookUrl,bookName,extension,md5,size,path,parserRegex="")=>__awaiter(void 0,void 0,void 0,function*(){var _b;try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"user-agent",userAgent:navigator.userAgent}));const response=yield fetch(bookUrl);if(!response.ok)throw new Error(`Failed to download book: ${response.status} ${response.statusText}`);const file_content=yield response.arrayBuffer();null===(_b=window.ReactNativeWebView)||void 0===_b||_b.postMessage(JSON.stringify({event:"finish-download"})),window.file_content=file_content;let rendition=_a.getRendition(file_content,{format:extension.toUpperCase(),readerMode:"",charset:"",animation:"",convertChinese:"no",parserRegex:parserRegex||"",isDarkMode:"no",isMobile:"yes",password:"",isConvertPDF:"no",backgroundColor:"",isScannedPDF:"",ocrEngine:""},window.Kookit);window.rendition=rendition,bookName=bookName.replace(/\.[^/.]+$/,"");let bookInfo=yield BookHelper.generateBook(bookName,extension,md5,size,path,file_content,rendition);if(!bookInfo||!bookInfo.key)return;window.ReactNativeWebView.postMessage(JSON.stringify({event:"metadata",bookInfo:bookInfo}))}catch(error){window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed",error:String(error)?String(error):"Unknown error"}))}}),BookHelper.precacheMobileBook=(serverUrl,bookKey)=>__awaiter(void 0,void 0,void 0,function*(){let cache=yield window.rendition.preCache(window.file_content);if(""===cache)window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",cacheBase64:"",key:bookKey}));else if("err"!==cache){try{const uploadUrl=`${serverUrl}/dav/${"cache-"+bookKey+".zip"}`,putResponse=yield fetch(uploadUrl,{method:"PUT",headers:{"Content-Type":"application/octet-stream",Overwrite:"T"},body:cache});if(!putResponse.ok)throw new Error(`上传失败: ${putResponse.status}`);console.info("文件上传成功")}catch(error){console.error("操作失败:"+error)}window.ReactNativeWebView.postMessage(JSON.stringify({event:"cache",key:bookKey}))}else window.ReactNativeWebView.postMessage(JSON.stringify({event:"error",message:"Parse book failed"}));window.file_content=null,window.rendition=null}),BookHelper.getPDFOcrResult=(chapterDocIndex,imageUrl)=>new Promise((resolve,reject)=>{try{window.ReactNativeWebView.postMessage(JSON.stringify({event:"get-ocr-result",index:chapterDocIndex,imageUrl:imageUrl})),document.addEventListener("message",function handleOcrResult(event){try{const data=JSON.parse(event.data);if("ocr-result"===data.event&&data.index===chapterDocIndex){document.removeEventListener("message",handleOcrResult);const ocrResult=data.text||"";resolve(ocrResult)}}catch(error){document.removeEventListener("message",handleOcrResult),reject(error)}})}catch(error){reject(error)}});class StyleHelper{static getDefaultCss(ConfigService,bookKey=""){const cssRules=[];cssRules.push("::selection{background:#f3a6a68c}"),cssRules.push("::-moz-selection{background:#f3a6a68c}"),cssRules.push(".kookit-note:hover{cursor:pointer;}"),cssRules.push(".kookit-note{line-height:inherit;}"),cssRules.push(".kookit-word-def{border-bottom:1px dashed currentColor;cursor:pointer;line-height:inherit;}"),cssRules.push(".kookit-word-def::after{content:'(' attr(data-meaning) ')';font-size:0.7em;opacity:0.6;margin-left:2px;}");const textRuleFontSize=ConfigService.getReaderConfig("fontSize")||18,textRuleLineHeight=ConfigService.getReaderConfig("lineHeight")||"1.25",textRuleLetterSpacing=ConfigService.getReaderConfig("letterSpacing");cssRules.push(".kookit-text-rule-replace,.kookit-text-rule-delete{font-size:0 !important;line-height:0 !important;letter-spacing:0 !important;word-spacing:0 !important;display:inline;vertical-align:baseline;}"),cssRules.push(".kookit-hyphen{display:inline;line-height:inherit;}.kookit-hyphen::after{content:'\\00AD';}"),cssRules.push(".kookit-text-rule-highlight{line-height:inherit !important;}"),cssRules.push(`.kookit-text-rule-replace::after{content:attr(data-kookit-replacement);font-size:${textRuleFontSize}px !important;line-height:${textRuleLineHeight} !important;`+(textRuleLetterSpacing?`letter-spacing:${textRuleLetterSpacing}px !important;`:"")+"color:inherit;}"),cssRules.push(".kookit-note-icon{line-height:1;font-size:14px;cursor:pointer;}"),cssRules.push(".kookit-note-icon::before{content:'📋';}");let fullTranslationMode=ConfigService.getAllListConfig("fullTranslationBooks").includes(bookKey)&&ConfigService.getReaderConfig("fullTranslationMode")||"";if(cssRules.push(`.kookit-translation-host::after{content: attr(data-kookit-translation);display:block;${"both"===fullTranslationMode||"target"===fullTranslationMode?this.getCustomCss(ConfigService):"display:none;"}${"target"===fullTranslationMode?"font-size: "+(ConfigService.getReaderConfig("fontSize")||18)+"px !important; text-indent: 2rem !important;":""} }`),"both"!==fullTranslationMode&&"target"!==fullTranslationMode||(cssRules.push('.kookit-translation-loading:after{content:"";display:block;width:16px;height:16px;margin:4px auto 0;border:2px solid currentColor;border-top-color:transparent;border-radius:50%;opacity:0.4;animation:kookit-spin 0.8s linear infinite;}'),cssRules.push("@keyframes kookit-spin{from{transform:rotate(0deg);}to{transform:rotate(360deg);}}")),cssRules.push("body,html,svg{margin: 0px !important; padding: 0px !important; font-size: 18px; background-color: transparent !important;background-size: contain !important; background-position: top left !important;-webkit-text-size-adjust: 100%;}"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("body,html{writing-mode: horizontal-tb !important;}"),cssRules.push(`a, article, cite, div, li, p:not(.hide), span:not(.kookit-note):not(.kookit-note-icon):not(.kookit-highlight-text):not(.kookit-note-tooltip):not(.kookit-word-def):not(.kookit-word-tooltip):not(.kookit-text-rule-replace):not(.kookit-text-rule-delete):not([class*="hljs"]), pre, dt, dd, table, bold, font, blockquote{${this.getCustomCss(ConfigService)}}`),cssRules.push(`h1:not(.hide), h2, h3, h4, h5, h6, title{${this.getCustomCss(ConfigService,!0)}}`),cssRules.push("code,pre{white-space:pre-wrap !important;word-wrap:break-word;word-break:break-word;overflow-wrap:anywhere;overflow:visible !important;overflow-x:visible !important;overflow-y:visible !important;max-height:none !important;break-inside:auto !important;page-break-inside:auto !important;-webkit-column-break-inside:auto !important;}"),cssRules.push("table{width:100% !important;max-width:100% !important;table-layout:fixed !important;box-sizing:border-box;border-collapse:collapse;margin:20px 0;line-height:1.6;margin-left:0 !important;margin-right:0 !important;}"),cssRules.push("td,th{word-break:break-word;overflow-wrap:anywhere;overflow:hidden;box-sizing:border-box;}"),cssRules.push("thead th{font-weight:bold;padding:14px 12px;text-align:left;white-space:normal;border-bottom:2px solid #ccc;background-color:rgba(0,0,0,0.05);}"),cssRules.push("td,th{padding:12px 14px;vertical-align:top;text-align:left;}"),cssRules.push("rt span{font-size: unset !important;}"),cssRules.push("rt{-webkit-user-select:none;user-select:none;}"),"yes"===ConfigService.getReaderConfig("isOverwriteLink")&&(cssRules.push("a{color: #0066cc !important; text-decoration: underline !important; cursor: pointer !important;}"),cssRules.push("a:hover{color: #004080 !important;}"),cssRules.push("a:visited{color: #6600cc !important;}")),"yes"===ConfigService.getReaderConfig("isOverwriteBackground")&&cssRules.push("body,html{background-color: transparent !important;}"),"yes"===ConfigService.getReaderConfig("isMergeWord")){const fontSize=ConfigService.getReaderConfig("fontSize")||18;cssRules.push(`h1{font-size: ${fontSize}px !important;}`)}return cssRules.push(this.getComicCss(ConfigService)),cssRules.push('aside[epub\\:type="footnote"],aside[epub\\:type="note"],aside[epub\\:type="endnote"],aside[epub\\:type="rearnote"],.hide{font-size:0px !important;}'),cssRules.push('aside[type="sidebar"],aside[epub\\:type="sidebar"]{ margin: 1.5em 0; padding: 1.2em 1.4em; background-color: #c7eafc; break-inside: avoid; page-break-inside: avoid; }'),cssRules.join("")}static getCustomCss(ConfigService,isTitle=!1){let cssRules=[];if(!isTitle&&ConfigService.getReaderConfig("fontSize")&&cssRules.push(`font-size: ${ConfigService.getReaderConfig("fontSize")}px !important`),isTitle)if(ConfigService.getReaderConfig("fontSize")){const fontSize=Math.round(1.25*parseInt(ConfigService.getReaderConfig("fontSize")||"18"));cssRules.push(`font-size: ${fontSize}px`)}else cssRules.push("font-size: 1.25em");const lineHeight=ConfigService.getReaderConfig("lineHeight");lineHeight&&cssRules.push(`line-height: ${lineHeight} !important`);const fontFamily=ConfigService.getReaderConfig("fontFamily"),subFontFamily=ConfigService.getReaderConfig("subFontFamily");if(fontFamily||subFontFamily){cssRules.push(`font-family: ${fontFamily||""} ${subFontFamily?(fontFamily?", ":"")+subFontFamily:""} !important`);const fontWeightMap={extralight:"200",light:"300",normal:"400",regular:"400",medium:"500",bold:"700",heavy:"900"},combinedFont=`${fontFamily||""} ${subFontFamily||""}`.toLowerCase();for(const[keyword,weight]of Object.entries(fontWeightMap))if(combinedFont.includes(keyword)){cssRules.push(`font-weight: ${weight} !important`);break}}const textColor=ConfigService.getReaderConfig("textColor"),backgroundColor=ConfigService.getReaderConfig("backgroundColor"),appSkin=ConfigService.getReaderConfig("appSkin"),isOSNight=ConfigService.getReaderConfig("isOSNight"),isOverwriteText=ConfigService.getReaderConfig("isOverwriteText"),isOverwriteBackground=ConfigService.getReaderConfig("isOverwriteBackground");let colorValue="",colorImportant="";textColor?colorValue=textColor:("rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorValue="white"),("yes"===isOverwriteText||"rgba(44,47,49,1)"===backgroundColor||"night"===appSkin||"system"===appSkin&&"yes"===isOSNight)&&(colorImportant="!important"),colorValue&&cssRules.push(`color: ${colorValue} ${colorImportant}`.trim()),"yes"===isOverwriteBackground&&cssRules.push("background-color: transparent !important");const letterSpacing=ConfigService.getReaderConfig("letterSpacing");letterSpacing&&cssRules.push(`letter-spacing: ${letterSpacing}px !important`);const textAlign=ConfigService.getReaderConfig("textAlign");textAlign&&cssRules.push(`text-align: ${textAlign} !important`),"yes"===ConfigService.getReaderConfig("isBold")&&cssRules.push("font-weight: bold !important"),"vertical"!==ConfigService.getReaderConfig("textOrientation")&&cssRules.push("writing-mode: horizontal-tb !important"),"yes"===ConfigService.getReaderConfig("isItalic")&&cssRules.push("font-style: italic !important"),"yes"===ConfigService.getReaderConfig("isShadow")&&cssRules.push("text-shadow: 2px 2px 2px #cccccc !important"),"yes"===ConfigService.getReaderConfig("isHyphenation")&&(cssRules.push("hyphens: auto !important"),cssRules.push("text-align: justify !important")),"yes"===ConfigService.getReaderConfig("isOrphanWidow")&&(cssRules.push("orphans: 1 !important"),cssRules.push("widows: 1 !important"));"yes"===ConfigService.getReaderConfig("isIndent")&&(isTitle?cssRules.push("text-indent: 0em !important"):cssRules.push("text-indent: 2em !important")),"yes"===ConfigService.getReaderConfig("isUnderline")&&cssRules.push("text-decoration: underline !important");const paraSpacing=ConfigService.getReaderConfig("paraSpacing");return paraSpacing&&(cssRules.push(`margin-bottom: ${paraSpacing}px !important`),cssRules.push(`margin-top: ${paraSpacing}px !important`)),cssRules.push("word-wrap: break-word"),cssRules.push("overflow: visible !important"),cssRules.join("; ")+";"}static getComicCss(ConfigService){const cssRules=[];cssRules.push("div.fs{height:unset !important;width:100% !important;min-height:100% !important;position:relative;text-align:left;vertical-align:middle;}"),cssRules.push("div.fs div{height:unset !important;min-height:100% !important;width:100% !important;margin:auto;text-align:center;vertical-align:middle;}"),cssRules.push(".div_view{height:unset !important;width:100% !important;min-height:100% !important;margin:auto;text-align:center;vertical-align:middle;}");const isScrollMode="scroll"===ConfigService.getReaderConfig("readerMode");let singlePageStyles=".singlePage{";isScrollMode&&(singlePageStyles+="max-width: 100% !important;"),isScrollMode&&(singlePageStyles+="max-height: unset !important;");return singlePageStyles+=`height:${isScrollMode?"unset":"100%"}!important;`,singlePageStyles+="width:100%!important;position: unset !important;",singlePageStyles+="}",cssRules.push(singlePageStyles),cssRules.join("")}}export{BookHelper,CacheRender,ComicRender,DocxRender,EpubRender,Fb2Render,HtmlRender,MdRender,MobiRender,PdfRender,PdfTextRender,StyleHelper,TxtRender}; diff --git a/src/containers/settings/backgroundSetting/backgroundSetting.css b/src/containers/settings/backgroundSetting/backgroundSetting.css index 5e5b4bda..a176c0a1 100644 --- a/src/containers/settings/backgroundSetting/backgroundSetting.css +++ b/src/containers/settings/backgroundSetting/backgroundSetting.css @@ -98,13 +98,12 @@ .background-preview-overlay { position: fixed; inset: 0; - background: rgba(0, 0, 0, 0.7); + background: rgba(0, 0, 0, 0.3); z-index: 1000; display: flex; flex-direction: column; align-items: center; justify-content: center; - animation: fade-in 0.15s ease; } .background-preview-image { From 5b80a3bd803b98928cafa3d8ca33e2690698bb17 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Sun, 4 Oct 2026 10:35:52 +0800 Subject: [PATCH 31/42] feat: implement llmReport function for reporting answers to the server --- src/components/popups/popupAssist/component.tsx | 5 ++--- src/utils/request/common.ts | 12 ++++++++++++ 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/src/components/popups/popupAssist/component.tsx b/src/components/popups/popupAssist/component.tsx index 27c8cd53..bb7e5c56 100644 --- a/src/components/popups/popupAssist/component.tsx +++ b/src/components/popups/popupAssist/component.tsx @@ -8,7 +8,6 @@ import { import Parser from "html-react-parser"; import DOMPurify from "dompurify"; import { Trans } from "react-i18next"; -import axios from "axios"; import { handleContextMenu, REPORT_REASONS, @@ -17,7 +16,7 @@ import { import toast from "react-hot-toast"; import { saveAs } from "file-saver"; import { getAnswerStream } from "../../../utils/request/reader"; -import { chatStream } from "../../../utils/request/common"; +import { chatStream, llmReport } from "../../../utils/request/common"; import { marked } from "marked"; import { sampleQuestion } from "../../../constants/settingList"; class PopupAssist extends React.Component { @@ -467,7 +466,7 @@ class PopupAssist extends React.Component { } toast.loading(this.props.t("Please wait"), { id: "report-feedback" }); try { - await axios.post("https://api.koodoreader.com/api/llm_report", { + await llmReport({ answer: content, question: userMessage?.content || "", reason: this.props.t(reason), diff --git a/src/utils/request/common.ts b/src/utils/request/common.ts index 27ae3f21..be2068f5 100644 --- a/src/utils/request/common.ts +++ b/src/utils/request/common.ts @@ -249,6 +249,18 @@ export const getNotification = async () => { // } return res; }; +export const llmReport = async (params: { + answer: string; + question: string; + reason: string; + user_id: string; +}) => { + const res = await axios.post( + "https://api.koodoreader.com/api/llm_report", + params + ); + return res; +}; export const parseWithSystemOCR = async (imageBase64: string) => { if (!isElectron) { return; From 37158dbd945c29bee07b79931d8d66560a5323d5 Mon Sep 17 00:00:00 2001 From: troyeguo <13820674+troyeguo@users.noreply.github.com> Date: Sun, 4 Oct 2026 10:48:37 +0800 Subject: [PATCH 32/42] style: adjust layout and styling for docked right mode in PopupAssist component --- .../popups/popupAssist/component.tsx | 65 ++++++++++++------- 1 file changed, 43 insertions(+), 22 deletions(-) diff --git a/src/components/popups/popupAssist/component.tsx b/src/components/popups/popupAssist/component.tsx index bb7e5c56..2a599559 100644 --- a/src/components/popups/popupAssist/component.tsx +++ b/src/components/popups/popupAssist/component.tsx @@ -646,8 +646,12 @@ class PopupAssist extends React.Component { style={{ display: "flex", alignItems: "center", - justifyContent: "flex-start", + justifyContent: this.props.isDockedRight + ? "space-between" + : "flex-start", flexShrink: 0, + width: this.props.isDockedRight ? "100%" : undefined, + marginTop: this.props.isDockedRight ? "10px" : "0px", }} >
{ onClick={() => { this.setState({ isAddNew: false, mode: "ask" }); }} + style={{ width: this.props.isDockedRight ? "50%" : undefined }} > {this.props.t("Reading Assistant")} @@ -672,6 +677,10 @@ class PopupAssist extends React.Component { onClick={() => { this.setState({ isAddNew: false, mode: "chat" }); }} + style={{ + width: this.props.isDockedRight ? "50%" : undefined, + marginRight: this.props.isDockedRight ? "0px" : "10px", + }} > {this.props.t("Chat Assistant")} @@ -683,34 +692,46 @@ class PopupAssist extends React.Component { display: "flex", alignItems: "center", gap: "8px", + width: this.props.isDockedRight ? "100%" : undefined, + justifyContent: this.props.isDockedRight + ? "space-between" + : undefined, + marginTop: this.props.isDockedRight ? "10px" : "0px", }} > -
- +
- - -
-
- + + +
+
- - + + + +
+